sqlite 一个空的tearDown方法使phpunit测试通过

q5lcpyga  于 2023-04-21  发布在  SQLite
关注(0)|答案(1)|浏览(125)

**我在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:我在一个新数据库上的迁移工作正常,甚至可以向上和回滚

lnvxswe2

lnvxswe21#

因为你使用的是DatabaseMigrations trait,Laravel会尝试执行migrate:rollback命令:

$this->beforeApplicationDestroyed(function () {
     $this->artisan('migrate:rollback');
 });

而且由于您的迁移是混乱的(这就是您关闭FK约束的原因),它会失败。
当你放置tearDown()方法时,你覆盖了父Illuminate\Foundation\Testing\TestCase类中的tearDown()方法,所以beforeApplicationDestroyed回调永远不会执行。
处理这个问题的最好方法是在每次迁移中修复down()方法,这样每个表都可以在执行migrate:rollback命令时删除。但是你也可以从tearDown()方法运行migrate:reset。或者像在setUp()方法中一样使用disableForeignKeyConstraints()禁用FK约束。

相关问题