**我在Laravel 5.3中有以下Test类,因为你可以看到tearDown()
方法是空的,我在内存中使用sqlite进行测试。
现在测试正在通过,但是当我删除空的tearDown()
方法时,它会抛出foreign key contraint failed exception
,
我使用sqlite进行测试,phpunit.xml
配置如下。
我试图将测试数据库更改为mysql,那时候一切正常(即使没有tearDown()
)。任何想法为什么没有tearDown()方法导致错误?
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Database\Eloquent\Model;
use App\Country;
class PhoneTest extends TestCase
{
use DatabaseMigrations;
public function setUp()
{
parent::setUp();
Schema::disableForeignKeyConstraints();
$this->seed(LocationsSeeder::class);
Schema::enableForeignKeyConstraints();
}
public function test_we_can_make_number_international()
{
$phoneService = resolve('Phone');
$international = $phoneService->makeInternational('0507639889', Country::find(1));
return $this->assertEquals($international, '+971507639889');
}
protected function tearDown()
{
//
}
}
环境: Laravel 5.3, 测试db:sqlite - inmemory phpunit 4.8.36 php - 7 PHPUnit配置
<php> <env name="APP_ENV" value="testing"/> <env name="DB_CONNECTION" value="sqlite"/> <env name="DB_DATABASE" value=":memory:"/> <env name="CACHE_DRIVER" value="array"/> <env name="SESSION_DRIVER" value="array"/> <env name="QUEUE_DRIVER" value="sync"/> </php>
编辑:我对新数据库的迁移工作正常,甚至可以上传和回滚
答案 0 :(得分:1)
由于您使用的是DatabaseMigrations
特征,Laravel会尝试执行migrate:rollback
命令:
$this->beforeApplicationDestroyed(function () {
$this->artisan('migrate:rollback');
});
由于您的迁移很混乱(这就是您关闭FK约束的原因),它会失败。
当您放置tearDown()
方法时,您将覆盖父tearDown()
类中的Illuminate\Foundation\Testing\TestCase
方法,因此永远不会执行beforeApplicationDestroyed
回调。
处理此问题的最佳方法是在每次迁移中修复down()
方法,因此可以在migrate:rollback
命令执行时删除每个表。但您也可以从tearDown()
方法运行migrate:reset
。或者像disableForeignKeyConstraints()
方法一样使用setUp()
来禁用FK约束。