Laravel: не удается пройти тест браузера с помощью признака RefreshDatabase

Мой тест не пройдёт, если я использую признак RefreshDatabase.

Без признака - тест пройдет, но данные остаются в базе данных.

Я использую:

  • Laravel 5.5 (свежий)
  • Ларадок: nginx mysql селен

Тесты выполняются из рабочего пространства Ларадока.

Это тест, простой, из официальной документации.

<?php

namespace Tests\Browser;

use App\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;

class LoginTest extends DuskTestCase
{
    use RefreshDatabase;

    /**
     * A Dusk test example.
     *
     * @return void
     */
    public function testLogin()
    {
        $user = factory(User::class)->create();

        // dump('wait...');
        // sleep(15);
        // dump('go!');

        $this->browse(function (Browser $browser) use ($user) {
            $browser->visit('/login')
                    ->type('email', $user->email)
                    ->type('password', 'secret')
                    ->press('Login')
                    ->assertPathIs('/home')
            ;
        });
    }
}

dump/sleep/dump просто посмотреть, был ли пользователь создан в базе данных. Это не!

Результат php artisan dusk является:

There was 1 failure:

1) Tests\Browser\LoginTest::testLogin
Failed asserting that '/login' matches PCRE pattern "/^\/home/u".

/var/www/vendor/laravel/dusk/src/Concerns/MakesAssertions.php:53
/var/www/tests/Browser/LoginTest.php:32
/var/www/vendor/laravel/dusk/src/TestCase.php:92
/var/www/tests/Browser/LoginTest.php:34

НОТА:
Утверждение текста "Эти учетные данные не соответствуют нашим записям." будет правдой, поэтому я считаю, что пользователь никогда не был создан.

3 ответа

В документе Laravel Dusk упоминается:

Большинство написанных вами тестов будут взаимодействовать со страницами, извлекающими данные из базы данных вашего приложения; однако ваши тесты Dusk никогда не должны использовать эту черту. Черта использует транзакции базы данных, которые не будут применимы или недоступны для HTTP-запросов. Вместо этого используйте трейт, который повторно мигрирует базу данных для каждого теста:

Таким образом, ответ использует DatabaseMigrationsвместо RefreshDatabase

Использование DatabaseMigrations черта вместо RefreshDatabase черта характера.

Не думаю, что проблема в драйвере sqlite / pgsql / whateversql. И я уверен, что вам не нужно ставить что-то вроде$app['config']... линии к \Tests\CreatesApplication::createApplication.

Я решил эту проблему бегом artisan config:clear перед artisan serve. Будет создан новый файл phpunit.dusk.xml, который будет перенаправлен на.env.dusk.{env}, а затем повторно выполните команду сумерек.

Другие вопросы по тегам