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

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

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

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

我们将不胜感激。

【问题讨论】:

    标签: laravel phpunit laravel-5.5


    【解决方案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>
    

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

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

    【讨论】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-23
      • 2018-03-12
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2018-05-30
      • 2018-02-24
      相关资源
      最近更新 更多