Laravel Dusk, DatabaseTransactions не выполняет откат

Я использую Laravel Dusk, следующий тест регистрации работает нормально, за исключением того, что он не откатывает транзакцию (т.е. запись пользователя, созданная в «Регистрации», всегда остается в БД). Все мои таблицы настроены на использование механизма InnoDB.

Любые идеи о том, что происходит? Я поместил журналы во многих местах, и ничего не выглядит особенно неправильным. Я также не получаю никаких ошибок в файле laravel.log.

use DatabaseTransactions;

protected $connectionsToTransact = [ 'mysql' ];

/**
 * A basic browser test example.
 *
 * @return void
 */
public function testBasicExample()
{
    $this->browse(function (Browser $browser) {
        $browser->visit('/')
                ->type('name', 'Automated User')
                ->type('email', '[email protected]')
                ->type('password', 'aaaaaa')
                ->type('password_confirmation', 'aaaaaa')
                ->press('Register')
                ->assertPathIs('/login');
    });

}

Это мое соединение в config/database.php

'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'unix_socket' => env('DB_SOCKET', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => 'innoDB',
    ],

ОБНОВЛЕНИЕ

Я пытался обновить модель после утверждения, но это тоже не работает. Похоже, что все транзакции БД вообще не выполняются.


person Jk33    schedule 28.03.2018    source источник


Ответы (1)


Вы не можете использовать DatabaseTransactions в тестах Dusk. Поскольку ваш веб-сайт открывает настоящий браузер, ваш тест выполняется в другом процессе.

Вы должны отменить изменения самостоятельно, например. удалив зарегистрированного пользователя.

person Jonas Staudenmeir    schedule 28.03.2018
comment
Значит, официальный раздел базы данных документации по тестированию предназначен только для HTTP-тестов? - person Jk33; 29.03.2018
comment
Какую документацию вы имеете в виду? Сумерки или Ларавель? - person Jonas Staudenmeir; 29.03.2018
comment
Эта документация применима только к чистым тестам Laravel, таким как $this->get('/');. Эти тесты не делают настоящих HTTP-запросов, они только притворяются. Таким образом, они используют одно и то же соединение с базой данных и могут объединяться в транзакции. - person Jonas Staudenmeir; 29.03.2018
comment
Имеет смысл. Наличие этого раздела рядом с тестами браузера кажется мне немного обманчивым. Спасибо. - person Jk33; 29.03.2018
comment
Они добавили примечание на странице Dusk для Laravel 5.5: laravel.com/docs/5.5/dusk# миграции - person Jonas Staudenmeir; 29.03.2018
comment
laravel.com/docs/6.x/dusk#migrations говорит (для Dusk) Когда для вашего теста требуются миграции, как в приведенном выше примере аутентификации, вы никогда не должны использовать трейт RefreshDatabase. Черта RefreshDatabase использует транзакции базы данных, которые не будут применяться к HTTP-запросам. Вместо этого используйте трейт DatabaseMigrations. К сожалению, у этого есть 2 проблемы: он вызывает migrate:fresh без заполнения и очень медленный, если у вас много миграций (по сравнению с use DatabaseTransactions, который, к сожалению, не может работать в сумерках). - person Ryan; 05.12.2019