**我在Laravel 5.3中有下面的Test类,正如你所看到的,tearDown()
方法是空的,我在内存中使用sqlite进行测试。现在测试正在通过,但是当我删除空的tearDown()
方法时,它抛出一个foreign key constraint failed exception
,我使用sqlite进行测试,phpunit.xml
配置如下。我试着将测试数据库更改为mysql,当时一切正常(即使没有tearDown()
)。任何想法为什么没有tearDown()方法导致错误?〈?php
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,测试数据库:sqlite - inmemory phpunit 4.8.36 php - 7PHPUnit配置
<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>
EDIT:我在一个新数据库上的迁移工作正常,甚至可以向上和回滚
1条答案
按热度按时间lnvxswe21#
因为你使用的是
DatabaseMigrations
trait,Laravel会尝试执行migrate:rollback
命令:而且由于您的迁移是混乱的(这就是您关闭FK约束的原因),它会失败。
当你放置
tearDown()
方法时,你覆盖了父Illuminate\Foundation\Testing\TestCase
类中的tearDown()
方法,所以beforeApplicationDestroyed
回调永远不会执行。处理这个问题的最好方法是在每次迁移中修复
down()
方法,这样每个表都可以在执行migrate:rollback
命令时删除。但是你也可以从tearDown()
方法运行migrate:reset
。或者像在setUp()
方法中一样使用disableForeignKeyConstraints()
禁用FK约束。