Laravel 5.5:使用 DatabaseMigrations 进行测试会删除所有表

Posted

技术标签:

【中文标题】Laravel 5.5:使用 DatabaseMigrations 进行测试会删除所有表【英文标题】:Laravel 5.5 : Testing with DatabaseMigrations deletes all tables 【发布时间】:2018-07-08 16:52:59 【问题描述】:

我一直在自学如何在 Laravel 5.5 中编写测试用例。

我注意到,当我运行具有DatabaseMigrations trait 的测试类时,所有与测试类相关的数据库表在运行测试后都会被删除。

默认情况下会发生这种情况吗?我在文档中没有找到任何线索。

我们将不胜感激。

【问题讨论】:

【参考方案1】:

DatabaseTransactionsDatabaseMigrations

使用DatabaseTransactions,当您运行测试时,它会准备事务、触发测试并在执行后回滚所有内容

DatabaseMigrations 触发php artisan migrate 命令,在应用程序被销毁之前,它会回滚所有内容。

还有 RefreshDatabase 出现在 Laravel 5.5 中,它有点取代了 DatabaseMigrationsDatabaseTransactions

使用RefreshDatabase,如果您使用的是内存数据库,它将为您运行php artisan migrate。如果您不使用内存数据库,它将删除所有表并重新运行php artisan migrate

我建议你使用内存数据库,可以在phpunit.xml文件的php标签中定义如下。

...
<php>
    <env name="APP_ENV" value="testing"/>
    <env name="DB_CONNECTION" value="sqlite"/>
    <env name="DB_DATABASE" value=":memory:"/>
    <env name="CACHE_DRIVER" value="array"/>
    <env name="SESSION_DRIVER" value="array"/>
    <env name="QUEUE_DRIVER" value="sync"/>
</php>

内存数据库的一些优点如下:

    跑得真快 不会影响您的实际数据库,因为一切都发生在内存中

【讨论】:

完美运行!谢谢! 帮到你真是太好了。 感谢分享! @PrinceLionelN'zi :memory: 是如何工作的。它是否会表现得像 mysql。 (支持所有SQL)【参考方案2】:

此 trait 中的 runDatabaseMigrations() 方法在运行测试后执行 migrate:rollback 命令。此命令删除所有表。

$this->artisan('migrate:rollback');

【讨论】:

以上是关于Laravel 5.5:使用 DatabaseMigrations 进行测试会删除所有表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.5 使用 artesaos/defender

作曲家自动加载 Laravel 5.5

Laravel 会话立即过期(Laravel 5.5)

Laravel 5.5 中的多字段排序

Laravel 5.5 - Laravel Passport 使用正确的授权类型?

Uncaught ReferenceError: $ is not defined - Laravel 5.5 + Laravel Mix