Laravel Dusk:如何使用内存数据库进行测试

时间:2018-02-07 22:14:58

标签: php laravel laravel-5.5 laravel-dusk

我一直在尝试使用 Laravel Dusk 进行测试时使用内存数据库。

此处我们有一个文件.env.dusk.local,其中包含以下值。

DB_CONNECTION=sqlite
DB_DATABASE=:memory:

以下是浏览器测试文件的片段。

class ViewOrderTest extends DuskTestCase
{
    use DatabaseMigrations;

    /** @test */
    public function user_can_view_their_order()
    {
        $order = factory(Order::class)->create();

        $this->browse(function (Browser $browser) use ($order) {
            $browser->visit('/orders/' . $order->id);
            $browser->assertSee('Order ABC'); //Order name
        });
    }
}

执行php artisan dusk时,Dusk开始浏览器测试。

然而,Dusk似乎正在访问我的本地数据库,因为测试浏览器上有一个订单名称,该名称仅存在于我的本地数据库中,而“订单ABC”预计会显示在浏览器上。

根据文件,Laravel Dusk允许我们设置the environmental variables.

  

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

我觉得Dusk没有访问单独的数据库。

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:5)

在Laravel黄昏浏览器测试时,您无法使用:memory:数据库。您的开发服务器和黄昏测试在不同的进程上运行。灰尘测试无法访问开发服务器上运行的进程的内存。

最好的解决方案是创建用于测试的sqlite文件数据库。

'sqlite_testing' => [
      'driver'   => 'sqlite',
      'database' => database_path('sqlite.testing.database'),
      'prefix'   => '',
 ],

在数据库文件夹中创建sqlite.testing.database文件。

确保在使用

运行测试之前运行开发服务器
php artisan serve --env dusk.local

答案 1 :(得分:-1)

您需要config/database.php

中的连接
'sqlite_testing' => [
     'driver'   => 'sqlite',
     'database' => ':memory:',
     'prefix'   => '',
],

然后在phpunit.xml文件中使用:

<env name="DB_DEFAULT" value="sqlite_testing" />

或在您的测试中使用:

 putenv('DB_DEFAULT=sqlite_testing');

在每次测试之前,不要忘记使用RefreshDatabase特征重置数据库。