2017-02-01 69 views
4

根据to the "Database Testing" documentation我可以在每次测试后重置数据库(第一个选项)。第二个选项是使用事务运行测试。这对我来说似乎是一个更好的方法,但如果我想用事务运行,迁移不会运行。用Laravel黄昏迁移一次

有没有什么办法可以为运行一次迁移所有的测试过程?

换句话说,我想运行迁移,用事务运行每个测试,然后回滚。我尝试了文档所说的内容,但我认为缺少一些东西。

回答

2

今天有一段时间与此纠缠在一起,并与迁移一起运行迁移似乎有诀窍。我测试的快照如下:

<?php 

namespace Tests\Browser; 

use App\User; 
use Tests\DuskTestCase; 

use Illuminate\Foundation\Testing\DatabaseMigrations; 
use Illuminate\Foundation\Testing\DatabaseTransactions; 

class DefaultTest extends DuskTestCase 
{ 
    use DatabaseMigrations, DatabaseTransactions; 

    /** 
    * A Dusk test example. 
    * 
    * @return void 
    */ 
    public function test_something() 
    { 
     //Add test stuff here 
    } 
} 

我有一对夫妇的工厂在我的实际测试,他们似乎通过与试验破坏后的数据迁移按预期运行。

+0

这只是运行数据库迁移。黄昏时不支持事务,因为它在浏览器中运行。 – Christophvh

+0

好的解决方案的人!真的:) –

1

目前无法与黄昏结合运行DatabaseTransactions。

https://github.com/laravel/dusk/issues/110

用户记录的创建,并在浏览器中使用它是 在两个不同的过程来完成。这意味着创建的用户是数据库事务的一部分 ,该数据库事务没有被提交,因此浏览器进程不能访问 。

数据库迁移工作。所以你应该使用这些。还要确保你运行一个独立的测试数据库,以免混淆你的生产/开发数据库。

https://laravel.com/docs/5.4/dusk#environment-handling

要强制黄昏运行测试时使用它自己的环境文件, 在项目的根目录中创建一个.env.dusk。{}环境文件。 例如,如果您将从您的 本地环境启动黄昏命令,则应创建一个.env.dusk.local文件。

运行测试时,Dusk将备份您的.env文件并将您的黄昏环境重命名为.env。一旦测试完成,您的.env 文件将被恢复。

由于DatabaseMigrations的工作原因,提供的答案有效。 use DatabaseTransactions不相关。

0

从我所了解的情况来看,我不认为使用黄昏时交易可以工作,因为黄昏中的每个浏览器请求都会创建一个单独的laravel应用程序实例。

以前,phpunit会在内存中创建一个新的应用程序(在setUp/方法中),然后测试该测试应用程序,然后将其销毁并设置下一个应用程序。因此,在为下一次测试启动新的数据库连接之前,可以将事务打包(或刚好在内部)创建和销毁该应用程序的某些部分。使用黄昏时,它是真正的端到端测试(包括浏览器,伪造的用户交互,本地机器上的路由选择等),这意味着它不是全部包含在运行测试的环境中像他们通常在phpunit中一样。

黄昏执行以下操作:

  • 复制你.env.dusk.*并启动chromedriver(或任何硒像你使用的东西)
  • 触发PHPUnit的shell命令(即新的命令,新工艺。)
  • phpunit命令运行你的黄昏测试,每个测试打开一个浏览器窗口并发出请求(每个请求开始一个新的php-fpm和php进程(对于nginx)) - 就像你自己发出这些请求一样。他们每个人都有单独的连接到数据库,所以不能与其他人的交易进行交互。

另外值得一提的是,DatabaseTransactions特点是在基础包,而不是黄昏包,所以它不是建/在考虑黄昏包装。

这也解释了为什么内存中的sqlite不能与黄昏一起工作,因为一个进程无法访问另一个进程的内存。