假设我有这个测试:
class test extends TestCase
{
use RefreshDatabase;
/** @test */
public function test_ids_example()
{
$courses = factory(Post::class, 3)->create();
$this->assertEquals([1, 2, 3], $courses->pluck('id')->toArray());
}
/** @test */
public function test_ids_example_2()
{
$courses = factory(Post::class, 4)->create();
$this->assertEquals([1, 2, 3, 4], $courses->pluck('id')->toArray());
}
}
当我一项一项地运行测试时,它通过了.. 但是当我运行整个测试文件时,我收到此错误:
test::test_ids_example_2
Failed asserting that two arrays are equal.
--- Expected
+++ Actual
@@ @@
Array (
- 0 => 1
- 1 => 2
- 2 => 3
- 3 => 4
+ 0 => 4
+ 1 => 5
+ 2 => 6
+ 3 => 7
)
因为即使我添加了“RefreshDatabase”特征,测试也不会重置自动增量“id”。怎么解决这个问题呢?如何为每次测试保留 id?
1- 在测试类的
DB::statement
方法中使用 setUp()
:
protected function setUp(): void
{
parent::setUp();
DB::statement('ALTER TABLE YourTableName AUTO_INCREMENT = 1');
}
2- 使用
DatabaseMigrations
特质(较慢)
use DatabaseMigrations;
注意:
RefreshDatabase
特征,对于像MySQL/PostgreSQL/...这样的数据库连接,将使用基于事务的方法。它会在每个测试方法之后回滚所有数据库更改,以快速有效地重置状态。