Laravel provides dedicated helpers for asserting on your database state within tests.
// Assert a record exists in the database
$this->assertDatabaseHas('posts', [
'title' => 'Hello World',
'user_id' => $user->id,
]);
// Assert a record does NOT exist
$this->assertDatabaseMissing('posts', ['title' => 'Deleted Post']);
// Assert count of records
$this->assertDatabaseCount('posts', 5);
// Assert a model has been soft deleted
$this->assertSoftDeleted($post);
public function test_post_can_be_deleted(): void
{
$user = User::factory()->create();
$post = Post::factory()->for($user)->create();
$response = $this->actingAs($user)
->delete(route('posts.destroy', $post));
$response->assertRedirect(route('posts.index'));
$this->assertSoftDeleted($post);
}
public function test_user_cannot_delete_others_post(): void
{
$owner = User::factory()->create();
$other = User::factory()->create();
$post = Post::factory()->for($owner)->create();
$this->actingAs($other)
->delete(route('posts.destroy', $post))
->assertForbidden();
$this->assertDatabaseHas('posts', ['id' => $post->id]);
}
use Illuminate\Support\Facades\Mail;
use App\Mail\WelcomeMail;
public function test_welcome_email_is_sent_on_registration(): void
{
Mail::fake();
$this->post(route('register'), [
'name' => 'Alice',
'email' => '[email protected]',
'password' => 'password',
'password_confirmation' => 'password',
]);
Mail::assertSent(WelcomeMail::class, fn ($mail) => $mail->hasTo('[email protected]'));
}