Skillshub laravel-testing
Automated testing standards with Pest and PHPUnit. Use when writing Pest or PHPUnit feature/unit tests in Laravel applications. (triggers: tests/**/*.php, phpunit.xml, feature, unit, mock, factory, sqlite)
install
source · Clone the upstream repo
git clone https://github.com/ComeOnOliver/skillshub
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/HoangNguyen0403/agent-skills-standard/laravel-testing" ~/.claude/skills/comeonoliver-skillshub-laravel-testing && rm -rf "$T"
manifest:
skills/HoangNguyen0403/agent-skills-standard/laravel-testing/SKILL.mdsource content
Laravel Testing
Priority: P1 (HIGH)
Structure
tests/ ├── Feature/ # Integration/HTTP tests ├── Unit/ # Isolated logic tests └── TestCase.php
Implementation Guidelines
Pest & Modern Testing
- Feature Tests: Use
at the top of Pest files. Example:uses(RefreshDatabase::class)
verifies database rolled back after each test.it('creates post', fn() => $this->postJson('/api/posts', [...]) - Transactions: For faster but non-truncating isolation, use
.DatabaseTransactions
Mocking & External Services
- Service Mocking: Use
with$this->mock(PaymentService::class)
to assert interaction.shouldReceive('charge')->once()->with(100) - Loose Verification: Use
for behavior validation without strict ordering.$this->spy() - 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
usingdefinition(): array
in factory classes.fake() - Generation: Run
.php artisan make:factory PostFactory --model=Post - SQLite Support: In
, setphpunit.xml
andDB_CONNECTION' value='sqlite'
for in-memory, lightning-fast tests.DB_DATABASE' value=':memory:'
HTTP Assertions
- Fluent Assertions: Chain
,assertStatus(201)
, andassertJson(['data' => ...])
.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
trait.RefreshDatabase - No
: Never DB::table()->insert() raw data in tests — use Eloquent Factories instead.DB::table()->insert() - No heavy computations in unit tests: Move to Feature layer.