我继承了一个laravel项目进行维护,并且出于各种无法解释的原因(以前的开发人员已经离开,没有任何联系方式)无法进行数据库迁移。
在我的代码库中,我受命增加测试的代码覆盖率。但是它们之间的测试没有任何隔离,因此,与此[answer] [1]相反,其中一些可能由于这个原因而失败。
为了解决此问题,我找到了laravel本身提供的[solution] [2]:
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
class ExampleTest extends TestCase
{
use RefreshDatabase;
/**
* A basic functional test example.
*
* @return void
*/
public function testBasicExample()
{
// Test something here
}
}
但是,根据我的理论,有以下问题:
如果没有迁移脚本,这种方法是否可以在没有迁移脚本的情况下工作?
为此,我希望您能删除它。
[1] https://softwareengineering.stackexchange.com/a/394148/249660
[2] https://laravel.com/docs/5.8/database-testing#resetting-the-database-after-each-test
答案 0 :(得分:0)
RefreshDatabase
特性在这种情况下不起作用,因为它在每次测试之前执行php artisan migrate:fresh
,但是没有要执行的迁移脚本。
您是否考虑使用Illuminate\Foundation\Testing\DatabaseTransactions
特性?这会将每个测试包装在数据库事务中,并可能为您提供足够的隔离。它不使用迁移。
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase
{
use DatabaseTransactions;
...
使用这种方法,当然必须使用创建的所有表来设置测试数据库,并且在添加新表时必须手动更改/迁移测试数据库。