laravel-testing
Laravel 13 testing with Pest PHP 4 or PHPUnit 12. Use when writing feature tests, unit tests, or any test code in a Laravel application. Triggers on tasks involving HTTP tests, model factories, database assertions, mocking facades, authentication testing, or test organisation patterns.
By asyrafhussin · 621 installs
npx skills add asyrafhussin/agent-skills --skill laravel-testing
Source repository · Upstream listing
Laravel 13 Testing — Pest PHP 4 & PHPUnit 12
Supports both Pest PHP 4 and PHPUnit 12. See Framework Detection below.
PHPUnit version note: Laravel 13 ships with phpunit/phpunit: ^12.5.12 in its default composer.json . All patterns in this skill are compatible with PHPUnit 11, 12, and 13.
Comprehensive testing guide for Laravel 13 applications. Contains 24 rules across 6 categories for writing fast, readable, and reliable tests. Supports both Pest PHP 4 and PHPUnit 12 (Laravel 13 default).
Framework Detection
Before writing or reviewing any test code, detect which testing framework the project uses:
Step 1 — Check composer.json
If pestphp/pest is present → use Pest syntax
If only phpunit/phpunit is present → use PHPUnit syntax
If both are present → Pest takes priority (Pest runs on top of PHPUnit)
Step 2 — Check for tests/Pest.php
If tests/Pest.php exists → Pest is configured , use Pest syntax
Step 3 — If still unclear, ask the user
"I couldn't detect the testing framework. Does this project use Pest PHP or PHPUnit ?"
Syntax Reference
Test Declaration
Pest PHPUnit
Test function test('...', fn() = ...) public function test ...(): void
Readable name it('...', fn() = ...) [Test] public function it ...()
Grouping describe('...', fn() = ...) Test class name / nested classes
Trait application uses(RefreshDatabase::class) use RefreshDatabase; inside class
Before each beforeEach(fn() = ...) protected function setUp(): void
After each afterEach(fn() = ...) protected function tearDown(): void
Parameterised with([...]) [DataProvider] attribute
Global setup uses(...) in('Feature') in Pest.php Base TestCase class
Core assertions (identical in both frameworks)
assertStatus , assertJson , assertJsonPath , assertDatabaseHas , assertModelExists , actingAs , Mail::fake() , Queue::fake() , Event::fake() , Notification::fake() , Storage::fake() — all work the same in Pest and PHPUnit.
When to Apply
Reference these guidelines when:
Writing feature or unit tests for Laravel
Testing HTTP endpoints and API responses
Creating factories and test data
Asserting database state after operations
Faking Mail, Queue, Notification, or Event facades
Testing authenticated routes and API tokens
Organising tests with describe blocks, datasets, or test classes
Rule Categories by Priority
Priority Category Impact Prefix
1 HTTP & Feature Tests CRITICAL http
2 Model Factories CRITICAL factory
3 Database Assertions HIGH db
4 Faking Services HIGH fake
5 Authentication Testing HIGH auth
6 Test Organisation Patterns MEDIUM pest
Quick Reference
1. HTTP & Feature Tests (CRITICAL)
http test structure Arrange/Act/Assert with factories — Pest + PHPUnit examples
http assert response assertStatus, assertJson, assertRedirect, assertJsonMissing
http assert json fluent Fluent assertJson with AssertableJson closure
http refresh database RefreshDatabase vs DatabaseTransactions — when to use each
2. Model Factories (CRITICAL)
factory define Define factories with typed fake data and PHP 8.3 syntax
factory states Factory states for distinct test scenarios
factory sequences sequence() for varied data across multiple records
factory relationships has(), for(), recycle(), afterCreating()
3. Database Assertions (HIGH)
db assert has assertDatabaseHas, assertModelExists for presence checks
db assert missing assertDatabaseMissing, assertModelMissing for deletion
db assert soft deletes assertSoftDeleted, trashed() factory state
4. Faking Services (HIGH)
fake mail Mail::fake(), assertSent vs assertQueued, assertNothingSent
fake queue Queue::fake(), assertPushed, assertPushedOn
fake notification Notification::fake(), assertSentTo, assertCount
fake event Event::fake(), assertDispatched, assertNotDispatched
fake storage Storage::fake(), UploadedFile::fake(), assertExists
fake ai agent Agent::fake(), assertPrompted, preventStrayPrompts (Laravel 13+)
fake ai media Image::fake(), Audio::fake(), Transcription::fake() (Laravel 13+)
fake ai data Embeddings::fake(), Reranking::fake(), Files::fake(), Stores::fake() (Laravel 13+)
5. Authentication Testing (HIGH)
auth acting as actingAs() for session/web authenticated tests
auth sanctum Sanctum::actingAs() for API token authentication
6. Test Organisation Patterns (MEDIUM)
pest describe it describe()/it() (Pest) or test class organisation (PHPUnit)
pest datasets with() datasets (Pest) or [DataProvider] (PHPUnit)
pest hooks beforeEach/afterEach (Pest) or setUp/tearDown (PHPUnit)
Essential Patterns
Pest
PHPUnit
How to Use
Read individual rule files for detailed explanations and code examples.
Each rule file contains:
YAML frontmatter with metadata (title, impact, tags)
Brief explanation of why it matters
Bad Example with explanation
Good Example with both Pest and PHPUnit where syntax differs
Laravel 13 specific context and references
Full Compiled Document
For the complete guide with all rules expanded: AGENTS.md