我一直在尝试使用 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没有访问单独的数据库。
任何建议都将受到赞赏。
答案 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特征重置数据库。