--- name: pest-testing description: >- Tests applications using the Pest 3 PHP framework. Activates when writing tests, creating unit or feature tests, adding assertions, testing Livewire components, architecture testing, debugging test failures, working with datasets or mocking; or when the user mentions test, spec, TDD, expects, assertion, coverage, or needs to verify functionality works. --- @php /** @var \Laravel\Boost\Install\GuidelineAssist $assist */ @endphp # Pest Testing 3 ## When to Apply Activate this skill when: - Creating new tests (unit or feature) - Modifying existing tests - Debugging test failures - Working with datasets, mocking, or test organization - Writing architecture tests ## Documentation Use `search-docs` for detailed Pest 3 patterns and documentation. ## Basic Usage ### Creating Tests All tests must be written using Pest. Use `{{ $assist->artisanCommand('make:test --pest {name}') }}`. ### Test Organization - Tests live in the `tests/Feature` and `tests/Unit` directories. - Do NOT remove tests without approval - these are core application code. - Test happy paths, failure paths, and edge cases. ### Basic Test Structure @boostsnippet("Basic Pest Test Example", "php") it('is true', function () { expect(true)->toBeTrue(); }); @endboostsnippet ### Running Tests - Run minimal tests with filter before finalizing: `{{ $assist->artisanCommand('test --compact --filter=testName') }}`. - Run all tests: `{{ $assist->artisanCommand('test --compact') }}`. - Run file: `{{ $assist->artisanCommand('test --compact tests/Feature/ExampleTest.php') }}`. ## Assertions Use specific assertions (`assertSuccessful()`, `assertNotFound()`) instead of `assertStatus()`: @boostsnippet("Pest Response Assertion", "php") it('returns all', function () { $this->postJson('/api/docs', [])->assertSuccessful(); }); @endboostsnippet | Use | Instead of | |-----|------------| | `assertSuccessful()` | `assertStatus(200)` | | `assertNotFound()` | `assertStatus(404)` | | `assertForbidden()` | `assertStatus(403)` | ## Mocking Import mock function before use: `use function Pest\Laravel\mock;` ## Datasets Use datasets for repetitive tests (validation rules, etc.): @boostsnippet("Pest Dataset Example", "php") it('has emails', function (string $email) { expect($email)->not->toBeEmpty(); })->with([ 'james' => 'james@laravel.com', 'taylor' => 'taylor@laravel.com', ]); @endboostsnippet ## Pest 3 Features ### Architecture Testing Pest 3 includes architecture testing to enforce code conventions: @boostsnippet("Architecture Test Example", "php") arch('controllers') ->expect('App\Http\Controllers') ->toExtendNothing() ->toHaveSuffix('Controller'); arch('models') ->expect('App\Models') ->toExtend('Illuminate\Database\Eloquent\Model'); arch('no debugging') ->expect(['dd', 'dump', 'ray']) ->not->toBeUsed(); @endboostsnippet ### Type Coverage Pest 3 provides improved type coverage analysis. Run with `--type-coverage` flag. ## Common Pitfalls - Not importing `use function Pest\Laravel\mock;` before using mock - Using `assertStatus(200)` instead of `assertSuccessful()` - Forgetting datasets for repetitive validation tests - Deleting tests without approval