Agent Skills: 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)

UncategorizedID: hoangnguyen0403/agent-skills-standard/laravel-testing

Install this agent skill to your local

pnpm dlx add-skill https://github.com/HoangNguyen0403/agent-skills-standard/tree/HEAD/skills/laravel/laravel-testing

Skill Files

Browse the full folder contents for laravel-testing.

Download Skill

Loading file tree…

skills/laravel/laravel-testing/SKILL.md

Skill Metadata

Name
laravel-testing
Description
"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)"

Laravel Testing

Priority: P1 (HIGH)

Workflow: Test a New Feature

  1. Generate factoryphp artisan make:factory PostFactory --model=Post.
  2. Write feature test — Use Pest with RefreshDatabase for isolation.
  3. Mock externals — Use $this->mock(Service::class) for third-party calls.
  4. Assert response — Chain assertStatus(), assertJson(), assertJsonStructure().
  5. Run with SQLite — Set DB_CONNECTION=sqlite and DB_DATABASE=:memory: in 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 uses(RefreshDatabase::class) at the top of Pest files. Example: it('creates post', fn() => $this->postJson('/api/posts', [...]) verifies database rolled back after each test.
  • Transactions: For faster but non-truncating isolation, use DatabaseTransactions.

Mocking & External Services

  • Service Mocking: Use $this->mock(PaymentService::class) with shouldReceive('charge')->once()->with(100) to assert interaction.
  • Loose Verification: Use $this->spy() for behavior validation without strict ordering.
  • 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 definition(): array using fake() in factory classes.
  • Generation: Run php artisan make:factory PostFactory --model=Post.
  • SQLite Support: In phpunit.xml, set DB_CONNECTION' value='sqlite' and DB_DATABASE' value=':memory:' for in-memory, lightning-fast tests.

HTTP Assertions

  • Fluent Assertions: Chain assertStatus(201), assertJson(['data' => ...]), and 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 RefreshDatabase trait.
  • No DB::table()->insert(): Never DB::table()->insert() raw data in tests — use Eloquent Factories instead.
  • No heavy computations in unit tests: Move to Feature layer.

References