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】:有DatabaseTransactions
和DatabaseMigrations
。
使用DatabaseTransactions
,当您运行测试时,它会准备事务、触发测试并在执行后回滚所有内容
DatabaseMigrations
触发php artisan migrate
命令,在应用程序被销毁之前,它会回滚所有内容。
还有 RefreshDatabase
出现在 Laravel 5.5 中,它有点取代了 DatabaseMigrations
和 DatabaseTransactions
。
使用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 Passport 使用正确的授权类型?
Uncaught ReferenceError: $ is not defined - Laravel 5.5 + Laravel Mix