【问题标题】:an empty tearDown method makes the phpunit test passess一个空的 tearDown 方法使 phpunit 测试通过
【发布时间】:2018-07-04 20:39:54
【问题描述】:

**我在 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, 测试数据库:sqlite - 内存 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>

编辑:我在新数据库上的迁移工作正常,甚至向上和回滚

【问题讨论】:

    标签: mysql laravel sqlite phpunit


    【解决方案1】:

    由于您使用的是 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。或者使用disableForeignKeyConstraints() 来禁用FK 约束,就像在setUp() 方法中所做的那样。

    【讨论】:

    • 但有一件事,为什么当我将测试数据库更改为 mysql 时这会起作用?
    • 感谢@Alexy Mezenin 的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多