一个空的tearDown方法使phpunit测试passess

时间:2018-01-25 14:45:04

标签: mysql laravel sqlite phpunit

**我在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>

编辑:我对新数据库的迁移工作正常,甚至可以上传和回滚

1 个答案:

答案 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约束。