流明 - 单元测试中的播种机

时间:2017-10-27 13:23:44

标签: testing phpunit lumen laravel-seeding

我试图在我公司的项目中实施单元测试,并且在尝试在我的数据库中使用单独的一组数据时遇到了一些奇怪的麻烦。

由于我希望在狭窄的环境中执行测试,我正在寻找在专用数据库中输入数据的最简单方法。长话短说,在这个程度上,我决定使用插入数据的MySQL转储。

这基本上是我的播种机代码:

public function run()
{
    \Illuminate\Support\Facades\DB::unprepared(file_get_contents(__DIR__ . '/data1.sql'));
}

现在问题出在这里。 在我的单元测试中,我可以调用播种机,但是:

  • 如果我在setUpBeforeClass()中调用播种器,它就可以了。虽然它不能满足我的需求,因为我希望能够为不同的测试调用不同的数据集
  • 如果我在测试中调用播种器,则数据永远不会插入数据库中(无论是否具有事务特征)。
  • 如果我在不使用原始sql文件的情况下使用DB :: insert而不是:: raw或:: unrepared或:: statement,则可以正常工作。但是我的插页太复杂了。

以下是我试过的一些相同结果:

    DB::raw(file_get_contents(__DIR__.'/database/data1.sql'));
    DB::statement(file_get_contents(__DIR__ . '/database/data1.sql'));

    $seeder = new CheckTestSeeder();
    $seeder->run();

    \Illuminate\Support\Facades\Artisan::call('db:seed', ['--class' => 'CheckTestSeeder']);

    $this->seeInDatabase('jackpot.progressive', [
        'name_progressive' => 'aaa'
    ]);

如果我在setUpBeforeClass()和测试中执行此操作,有关如何继续以及为什么我有不同行为的任何指示将不胜感激!

1 个答案:

答案 0 :(得分:0)

您可以按照here的说明使用Illuminate\Foundation\Testing\RefreshDatabase特质。如果您需要更多内容,可以覆盖refreshTestDatabase特征中的RefreshDatabase方法。

protected function refreshTestDatabase()
{
    parent::refreshTestDatabase();

    \Illuminate\Support\Facades\Artisan::call('db:seed', ['--class' => 'CheckTestSeeder']);
}