В Laravel есть черта под названием DatabaseTransactions, которая откатывает все транзакции, сделанные тестом, чтобы сохранить базу данных чистой и изолированной. Это хорошо и полезно.
Но в PHPUnit есть функция Тестовые зависимости, в которой вы можете использовать вывод другого теста:
/**
* @test
*/
public function a_producer_test()
{
$user = factory(User::class)->create();
return $user;
}
/**
* @test
* @depends a_producer_test
*/
public function a_consumer_test(User $user)
{
$id = $user->id;
}
При использовании DatabaseTransactions вы не можете использовать $user внутри a_consumer_test, потому что транзакция, создавшая пользователя, откатывается и, следовательно, $user пуста. Если убрать use DatabaseTransactions; из тестового класса, все работает нормально и можно использовать $user.
Теперь я хочу иметь $user внутри своего a_consumer_test метода, но я хочу откатывать транзакции и очищать базу данных после выполнения тестов. Как я могу это сделать?





Вы можете использовать базу данных SQLite в памяти, тогда вам не придется откатывать транзакции. Вы можете просто добавить в свой phpunit.xml файл следующие строки:
<env name = "DB_CONNECTION" value = "sqlite"/>
<env name = "DB_DATABASE" value = ":memory:"/>
База данных будет создана только для тестов, а затем будет уничтожена после запуска тестов.