Laravel Testing
Priority: P1 (HIGH)
Workflow: Test a New Feature
- Generate factory —
php artisan make:factory PostFactory --model=Post. - Write feature test — Use Pest with
RefreshDatabasefor isolation. - Mock externals — Use
$this->mock(Service::class)for third-party calls. - Assert response — Chain
assertStatus(),assertJson(),assertJsonStructure(). - Run with SQLite — Set
DB_CONNECTION=sqliteandDB_DATABASE=:memory:inphpunit.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)withshouldReceive('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(): arrayusingfake()in factory classes. - Generation: Run
php artisan make:factory PostFactory --model=Post. - SQLite Support: In
phpunit.xml, setDB_CONNECTION' value='sqlite'andDB_DATABASE' value=':memory:'for in-memory, lightning-fast tests.
HTTP Assertions
- Fluent Assertions: Chain
assertStatus(201),assertJson(['data' => ...]), andassertJsonStructure. - 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
RefreshDatabasetrait. - 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.