Giao diện
Database Testing
Nguồn gốc: Bản dịch từ Database Testing
Giới thiệu (Introduction)
Laravel cung cấp nhiều công cụ và assertion hữu ích để test ứng dụng có sử dụng database. Kết hợp model factories và seeders giúp tạo bản ghi test dễ dàng sử dụng Eloquent models và relationships.
Reset Database sau mỗi Test
Sử dụng trait RefreshDatabase để đảm bảo data từ test trước không ảnh hưởng test sau:
php
<?php
use Illuminate\Foundation\Testing\RefreshDatabase;
pest()->use(RefreshDatabase::class);
test('basic example', function () {
$response = $this->get('/');
// ...
});php
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class ExampleTest extends TestCase
{
use RefreshDatabase;
public function test_basic_example(): void
{
$response = $this->get('/');
// ...
}
}RefreshDatabase không migrate nếu schema đã up-to-date — chỉ chạy test trong database transaction.
Thay thế khác (chậm hơn):
DatabaseMigrations— migrate lại mỗi testDatabaseTruncation— truncate tất cả tables
Model Factories
Sử dụng Eloquent factories để tạo bản ghi test:
php
use App\Models\User;
$user = User::factory()->create();Tạo nhiều bản ghi:
php
$users = User::factory()->count(3)->create();Tùy chỉnh attributes:
php
$user = User::factory()->create([
'name' => 'Abigail',
]);Running Seeders
Chạy seeder trong test:
php
test('orders can be created', function () {
$this->seed();
// Hoặc seeder cụ thể:
$this->seed(OrderStatusSeeder::class);
});php
public function test_orders_can_be_created(): void
{
$this->seed();
$this->seed(OrderStatusSeeder::class);
}Dùng $this->seed() không tham số → chạy DatabaseSeeder.
Trên RefreshDatabase, seed trước mỗi test tự động:
php
use Database\Seeders\OrderStatusSeeder;
pest()->use(RefreshDatabase::class);
// Tự seed trước mỗi test
beforeEach(function () {
$this->seed(OrderStatusSeeder::class);
});Available Assertions
Database Assertions
| Method | Mô tả |
|---|---|
assertDatabaseCount($table, $count) | Bảng có đúng số bản ghi |
assertDatabaseHas($table, $data) | Bảng chứa bản ghi khớp data |
assertDatabaseMissing($table, $data) | Bảng không chứa bản ghi khớp data |
assertSoftDeleted($table, $data) | Bản ghi đã soft delete |
assertNotSoftDeleted($table, $data) | Bản ghi chưa soft delete |
assertModelExists($model) | Model tồn tại trong database |
assertModelMissing($model) | Model không tồn tại |
Ví dụ:
php
$this->assertDatabaseHas('users', [
'email' => 'sally@example.com',
]);
$this->assertDatabaseMissing('users', [
'email' => 'sally@example.com',
]);
$this->assertDatabaseCount('users', 5);
$this->assertSoftDeleted($user);
$this->assertModelExists($user);
$this->assertModelMissing($user);