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.