在 Laravel/PHPunit 测试类中,我向类中添加了
use RefreshDatabase
,我理解这应该能够在测试完成时恢复测试期间对数据库的更改。
但是每当我在类中运行测试时,数据库中的所有表都会被删除,并且测试失败(因为这些表不存在!)。
文档建议让数据库在测试后恢复就像像我一样添加一行一样简单,我是否遗漏了一些东西?
如果您不想使用 RefreshDatabase 擦除并重建数据库,则可以简单地使用 DatabaseTransactions 特征。 这将回滚测试期间所做的任何更改。
<?php
namespace Tests\Unit;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase
{
use DatabaseTransactions;
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$this->assertTrue(true);
}
}
更新您的
phpunit.xml
并添加以下 2 行
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
TL;DR 您想使用不同的数据库进行测试。正确的方法是使用一个
.env.testing
文件来复制现有 .env
文件中的所有环境变量。确保创建一个新的本地数据库,然后更新新文件中的 DB_DATABASE
环境变量。
RefreshDatabase
特征可能是测试中最常用的特征。它在每次测试运行之前运行迁移,并将每个单独的测试方法包装在一个事务中,以便在测试完成时回滚。
当您运行测试时,Laravel 会自动将应用程序环境设置为“测试”(相当于
app()->environment('testing')
),这就是为什么它会在 .env.testing
文件中查找环境变量。
您也可能不需要复制所有环境变量,但如果您正在运行 Jetstream 提供的测试,您至少需要将 APP_KEY
复制到 .env.testing
文件。