Возможно ли выполнить тестирование InMemory с переносом и заполнением один раз

#php #laravel #testing #in-memory-database

#php #laravel #тестирование #база данных в памяти

Вопрос:

Я пишу функциональные тесты с базой данных в памяти

Недавно я установил плагин, разрешение laravel.

раньше в моей таблице было простое profile_id поле users . Итак, мне просто пришлось использовать refreshDatabase trait create пользователя и тестировать его для каждого пользовательского теста. Это было довольно быстро.

Теперь я перешел на разрешение laravel, я определил более 100 разрешений. Я должен перенести DB и заполнить их для каждого теста. Теперь каждый тест занимает до 3 секунд, и у меня 112 тестов, и это только начало. Это слишком медленно.

Я попытался использовать метод MigrateAndSeedOnce внутри моего setUp() метода:

 trait MigrateFreshSeedOnce
{
    /**
     * If true, setup has run at least once.
     * @var boolean
     */
    protected static $setUpHasRunOnce = false;
    /**
     * After the first run of setUp "migrate:fresh --seed"
     * @return void
     */
    public function setUp() :void
    {
        parent::setUp();
        if (!static::$setUpHasRunOnce) {
            Artisan::call('migrate:fresh');
            $this->seed('SourceTableSeeder'); 

            $this->seed('RoleTableSeeder');
            $this->seed('PermissionTableSeeder');

            $this->seed('RepartitionTableSeeder'); 

            $this->company = Company::factory()->create();
            $this->operation = Operation::factory()->create(['company_id' => 1]);
            $this->user = User::factory()->create(
                [
                    'email' => 'exapmle@company.com',
                    'company_id' => 1, 
                    'operation_id' => 1,
                ]);
            $this->user->assignRole(User::SUPER_ADMIN);
            static::$setUpHasRunOnce = true;
        }
        $this->actingAs($this->user);

    }
 

Это отлично работает для первого теста, но для второго теста $this->user равно null.

Возможно ли выполнить это с помощью базы данных в памяти (это было бы намного быстрее), или я должен переключиться на Sqlite DB (медленнее), или есть какой-либо другой лучший вариант?