Agent-skills-standard laravel-testing
Write Pest feature tests with RefreshDatabase, mock external services, and create test data with Eloquent Factories in Laravel. Use when adding HTTP tests, configuring SQLite in-memory test database, or mocking payment services. (triggers: tests/**/*.php, phpunit.xml, feature, unit, mock, factory, sqlite)
install
source · Clone the upstream repo
git clone https://github.com/HoangNguyen0403/agent-skills-standard
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/HoangNguyen0403/agent-skills-standard "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/laravel/laravel-testing" ~/.claude/skills/hoangnguyen0403-agent-skills-standard-laravel-testing && rm -rf "$T"
manifest:
skills/laravel/laravel-testing/SKILL.mdsource content
Laravel Testing
Priority: P1 (HIGH)
Workflow: Test New Feature
- Generate factory —
.php artisan make:factory PostFactory --model=Post - Write feature test — Use Pest with
for isolation.RefreshDatabase - Mock externals — Use
for third-party calls.$this->mock(Service::class) - Assert response — Chain
,assertStatus()
,assertJson()
.assertJsonStructure() - Run with SQLite — Set
andDB_CONNECTION=sqlite
inDB_DATABASE=:memory:
.phpunit.xml
Pest Feature Test Example
See implementation examples for Pest feature tests and test directory structure.
Implementation Guidelines
Pest & Modern Testing
- Feature Tests: Use
at top of Pest files. Example:uses(RefreshDatabase::class)
verifies database rolled back after each test.it('creates post', fn() => $this->postJson('/api/posts', [...]) - Transactions: For faster but non-truncating isolation, use
.DatabaseTransactions
Mocking & External Services
- Service Mocking: Use
with$this->mock(PaymentService::class)
to assert interaction.shouldReceive('charge')->once()->with(100) - Loose Verification: Use
for behavior validation without strict ordering.$this->spy() - Network Safety: Never make real network calls in automated tests.
Test Data & Infrastructure
- Factories: Create test data via
.Post::factory()->count(3)->create(['user_id' => $id]) - Definition: Implement
usingdefinition(): array
in factory classes.fake() - Generation: Run
.php artisan make:factory PostFactory --model=Post - SQLite Support: In
, setphpunit.xml
andDB_CONNECTION' value='sqlite'
for in-memory, lightning-fast tests.DB_DATABASE' value=':memory:'
HTTP Assertions
- Fluent Assertions: Chain
,assertStatus(201)
, andassertJson(['data' => ...])
.assertJsonStructure - Header Verification: Use
.assertHeader('Content-Type', 'application/json')
Anti-Patterns
- No real network calls: Always mock or stub external services.
- No state leakage between tests: Use
trait.RefreshDatabase - No
: Never DB::table()->insert() raw data in tests — use Eloquent Factories instead.DB::table()->insert() - No heavy computations in unit tests: Move to Feature layer.