Laravel测试数据库不会回滚

时间:2017-07-15 07:50:57

标签: php laravel-5.3

我正在尝试使用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');
}

关于如何解决此问题的任何想法?

1 个答案:

答案 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方法,在每次测试后删除它,并允许在初始测试之后的其余测试按预期运行。