.cursor/skills/pest-testing/SKILL.md
Use search-docs for detailed Pest 4 patterns and documentation.
All tests must be written using Pest. Use vendor/bin/sail artisan make:test --pest {name}.
tests/Feature and tests/Unit directories.tests/Browser/ directory.Pest supports both test() and it() functions. Before writing new tests, check existing test files in the same directory to match the project's convention. Use test() if existing tests use test(), or it() if they use it().
it('is true', function () {
expect(true)->toBeTrue();
});
vendor/bin/sail artisan test --compact --filter=testName.vendor/bin/sail artisan test --compact.vendor/bin/sail artisan test --compact tests/Feature/ExampleTest.php.Use specific assertions (assertSuccessful(), assertNotFound()) instead of assertStatus():
it('returns all', function () {
$this->postJson('/api/docs', [])->assertSuccessful();
});
| Use | Instead of |
|---|---|
assertSuccessful() | assertStatus(200) |
assertNotFound() | assertStatus(404) |
assertForbidden() | assertStatus(403) |
Import mock function before use: use function Pest\Laravel\mock;
Use datasets for repetitive tests (validation rules, etc.):
<!-- Pest Dataset Example -->it('has emails', function (string $email) {
expect($email)->not->toBeEmpty();
})->with([
'james' => '[email protected]',
'taylor' => '[email protected]',
]);
| Feature | Purpose |
|---|---|
| Browser Testing | Full integration tests in real browsers |
| Smoke Testing | Validate multiple pages quickly |
| Visual Regression | Compare screenshots for visual changes |
| Test Sharding | Parallel CI runs |
| Architecture Testing | Enforce code conventions |
Browser tests run in real browsers for full integration testing:
tests/Browser/.Event::fake(), assertAuthenticated(), and model factories.RefreshDatabase for clean state per test.it('may reset the password', function () {
Notification::fake();
$this->actingAs(User::factory()->create());
$page = visit('/sign-in');
$page->assertSee('Sign In')
->assertNoJavaScriptErrors()
->click('Forgot Password?')
->fill('email', '[email protected]')
->click('Send Reset Link')
->assertSee('We have emailed your password reset link!');
Notification::assertSent(ResetPassword::class);
});
Quickly validate multiple pages have no JavaScript errors:
<!-- Pest Smoke Testing Example -->$pages = visit(['/', '/about', '/contact']);
$pages->assertNoJavaScriptErrors()->assertNoConsoleLogs();
Capture and compare screenshots to detect visual changes.
Split tests across parallel processes for faster CI runs.
Pest 4 includes architecture testing (from Pest 3):
<!-- Architecture Test Example -->arch('controllers')
->expect('App\Http\Controllers')
->toExtendNothing()
->toHaveSuffix('Controller');
use function Pest\Laravel\mock; before using mockassertStatus(200) instead of assertSuccessful()assertNoJavaScriptErrors() in browser tests