Storing in Database
assertDatabaseHas vs assertSame
When testing a store method, you want to know the record was created correctly.
Controller
// app/Http/Controllers/UserController.php
public function store(StoreUserRequest $request)
{
$user = User::create($request->validated());
return redirect()->route('users.show', $user);
}
The vague way
// tests/Feature/Http/Controllers/UserController/StoreTest.php
$this->post(route('users.store'), [
'name' => 'John Doe',
'email' => '[email protected]',
]);
$this->assertDatabaseHas('users', [
'email' => '[email protected]',
'name' => 'John Doe',
]);
The granular way I prefer
// tests/Feature/Http/Controllers/UserController/StoreTest.php
$response = $this->post(route('users.store'), [
'name' => 'John Doe',
'email' => '[email protected]',
]);
$user = User::latest()->first();
$this->assertSame('John Doe', $user->name);
$this->assertSame('[email protected]', $user->email);
$this->assertTrue($user->email_verified_at->isToday());
$response->assertRedirect(route('users.show', $user));
Granular assertions tell you exactly what failed. No guessing.