У меня есть проект Laravel 5.4, и я пытаюсь использовать Dusk для запуска некоторого теста. Я хочу сбросить, перенести и запустить перед выполнением теста. Я настроил его на использование SQLite и в идеале хочу запустить его в памяти, но физический файл тоже подойдет.
Я смог получить то, что хочу, изменив Illuminate \ Foundation \ Testing \ DatabaseMigrations;
Originial:
public function runDatabaseMigrations()
{
$this->artisan('migrate');
$this->app[Kernel::class]->setArtisan(null);
$this->beforeApplicationDestroyed(function () {
$this->artisan('migrate:rollback');
});
}
Моя версия:
public function runDatabaseMigrations()
{
$this->artisan('migrate:refresh');
$this->artisan('db:seed');
$this->app[Kernel::class]->setArtisan(null);
$this->beforeApplicationDestroyed(function () {
$this->artisan('migrate:rollback');
});
}
Но, конечно, я потеряю это с некоторыми будущими обновлениями, поэтому мне нужно переопределить мою черту.
Я скопировал эту черту в App \ Traits \ DatabaseMigrations.php и изменил пространство имен.
<?php
namespace App\Traits;
use Illuminate\Contracts\Console\Kernel;
trait DatabaseMigrations
{
/**
* Define hooks to migrate the database before and after each test.
*
* @return void
*/
public function runDatabaseMigrations()
{
$this->artisan('migrate:refresh');
$this->artisan('db:seed');
$this->app[Kernel::class]->setArtisan(null);
$this->beforeApplicationDestroyed(function () {
$this->artisan('migrate:rollback');
});
}
}
MyTest.php выглядит следующим образом:
<?php
namespace Tests\Browser;
use App\User;
use Tests\Browser\Pages\Dashboard;
use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
//use Illuminate\Foundation\Testing\DatabaseMigrations;
use App\Traits\DatabaseMigrations;
class MyTest extends DuskTestCase
{
use DatabaseMigrations;
но это не работает Я получаю ошибку:
PDOException: SQLSTATE [HY000]: общая ошибка: 1 нет такой таблицы: пользователи
Так или иначе, миграции не запускаются без ошибок по этому поводу, но в результате мой тест не проходит, потому что нет таблиц.
Что работает, так это:
<?php
namespace Tests\Browser;
use App\User;
use Tests\Browser\Pages\Dashboard;
use Illuminate\Contracts\Console\Kernel;
use Tests\DuskTestCase;
use Laravel\Dusk\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
// use App\Traits\DatabaseMigrations;
class WorkshopRegistrationTest extends DuskTestCase
{
public function runDatabaseMigrations()
{
$this->artisan('migrate:refresh');
$this->artisan('db:seed');
$this->app[Kernel::class]->setArtisan(null);
$this->beforeApplicationDestroyed(function () {
$this->artisan('migrate:rollback');
});
}
use DatabaseMigrations;
но мне не нравится помещать этот метод в каждый тестовый файл. Кто-нибудь знает, почему один метод работает, а другой нет? Первый метод кажется мне, с небольшим знанием ООП, совершенно нормальным.
Задача ещё не решена.
Других решений пока нет …