【问题标题】:Lumen - seeder in Unit testsLumen - 单元测试中的播种机
【发布时间】:2018-04-09 02:57:00
【问题描述】:

我正在尝试在我公司的项目中实施单元测试,但在尝试在我的数据库中使用一组单独的数据时遇到了一些奇怪的问题。

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

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

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

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

  • 如果我在 setUpBeforeClass() 中调用播种机,它可以工作。虽然它不符合我的需求,因为我希望能够为不同的测试调用不同的数据集
  • 如果我在测试中调用播种器,数据永远不会插入到数据库中(无论有无事务特征)。
  • 如果我使用 DB::insert 而不是 ::raw 或 ::unprepared 或 ::statement 而不使用原始 sql 文件,它可以工作。但是我的插入太复杂了。

以下是我尝试的一些方法,结果相同:

    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() 和测试中这样做,任何关于如何继续以及为什么我会出现不同行为的指针将不胜感激!

【问题讨论】:

    标签: testing phpunit lumen laravel-seeding


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 2018-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 2019-06-28
      • 2019-07-31
      相关资源
      最近更新 更多