Laravel phpunit, как использовать разные миграции для тестов - PullRequest
2 голосов
/ 15 января 2020

Я пытаюсь настроить тесты в Laravel, но я хочу запустить миграции, отличные от тех, которые обычно выполняются.

Миграции, которые я запускаю для запуска базы данных, импортируют данные из производственной среды.
Для тестирования я хочу использовать другую базу данных, называемую «тест», и хочу заполнить эту тестовую базу данных тестовыми данными, а не производственными данными.

Я добавил соединение «тестирования» в config/database.php который использует «тестовую» базу данных:

'connections' => [

        'mysql' => [
            'database' => env('DB_DATABASE', 'forge'),
            ...
        ],

        'testing' => [
            'database' => 'test',
            ...
        ],
],

И я настраиваю phpunit.xml для использования этого «тестового» соединения:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit ...>
    ...
    <php>
        <env name="DB_CONNECTION" value="testing"/>
        ...
    </php>
</phpunit>

Теперь я хочу инициализировать эту «тестовую» базу данных с тестовыми данными, используя миграции из другой папки, отличной от папки по умолчанию.

Я могу использовать обычные миграции следующим образом:

<?php

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;

abstract class TestCase extends BaseTestCase
{
    use DatabaseMigrations;

    public function setUp(): void
    {
        parent::setUp();
        $this->seed();
    }
}

Но для этого используется папка по умолчанию database/migrations. Я хочу поместить тестовые миграции в папку tests/database/migrations.

Можно ли разрешить use DatabaseMigrations; использовать миграции из другой папки?

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Вам может потребоваться переопределить метод runDatabaseMigrations в признаке DatabaseMigrations и указать путь базы данных приложения оттуда до запуска миграции.

В итоге метод runDatabaseMigrations может выглядеть следующим образом:

use DatabaseMigrations { runDatabaseMigrations as runMigration; }

    public function runDatabaseMigrations()
    {
        $this->app->useDatabasePath(base_path('tests/database')); //example path
//        dump($this->app->databasePath());
        $this->runMigration();
    }

Или вы можете установить в методе boot вашего провайдера AppService:

    if (config('app.env') === 'testing') { //Laravel automatically set env to 'testing' when running test
        $this->app->useDatabasePath(base_path('tests/database'));
    }

Миграция будет искать подпапку "tests / database", называемую "migrations" .

PS: Это будет побочным эффектом, если у вас есть другой код или папка в папке database по умолчанию. Например, ваш фабричный класс там не будет найден для этого тестового класса.

1 голос
/ 15 января 2020

Artisan migrate имеет опцию пути, вы должны создать свою собственную черту, чтобы иметь аналогичную функциональность. Я думаю что-то вроде этого.

trait PathDatabaseMigrations {

    public function runDatabaseMigrations()
    {
        // optimal 
        $path = 'tests/database/migrations';

        $this->artisan('migrate:fresh', ['--path' => $path,]);

        $this->app[Kernel::class]->setArtisan(null);

        $this->beforeApplicationDestroyed(function () {
            $this->artisan('migrate:rollback', ['--path' => $path,]);

            RefreshDatabaseState::$migrated = false;
        });
    }
}
...