我正在尝试使用Laravel运行CI测试。但是,测试总是失败,因为数据库在每次测试后似乎都没有回滚。这会导致以下错误:
Illuminate\Database\QueryException: SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'user_roles' already exists (SQL: create table `user_roles` (`id` int unsigned not null auto_increment primary key, `user_id` int unsigned not null, `role_id` int unsigned not null, `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate utf8mb4_unicode_ci)
我尝试了一些我在互联网上找到的代码,它在测试类上使用了DatabaseMigrations
特征,这对第一次测试很有效,但对其余部分不起作用:
/**
* Set up the environment for testing.
*/
public function setUp()
{
parent::setUp();
$this->runDatabaseMigrations();
// Create an example user
$this->user = new User();
$this->user->name = 'Test User';
$this->user->email = 'test@example.com';
$this->user->password = '';
$this->user->save();
}
甚至尝试在测试的migrate:rollback
方法中添加tearDown
调用,但无济于事:
public function tearDown()
{
parent::tearDown();
$this->artisan('migrate:rollback');
}
关于如何解决此问题的任何想法?
答案 0 :(得分:1)
所以在发布此问题之后,我查看了迁移,因为我已经意识到在我的user_roles
表之前有一些表正在迁移。这是我注意到down
函数从表中删除了外键,但没有删除它:
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('user_roles', function (Blueprint $table) {
$table->dropForeign('user_roles_user_id_foreign');
$table->dropForeign('user_roles_role_id_foreign');
});
}
将Schema::drop('user_roles');
添加到down
方法,在每次测试后删除它,并允许在初始测试之后的其余测试按预期运行。