Я столкнулся с серьезной проблемой при написании тестов. Я использую Laravel 5.6.0 в качестве фреймворка и PHPUnit 7.0 для тестирования. В качестве тестовой БД я использовал sqlite с хранением в памяти. Это из моего database.php
:
'sqlite_testing' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
Но моя проблема в том, что у меня есть несколько мест, где я использую whereRaw
, например $query->whereRaw('STR_TO_DATE(CONCAT(
date , " ",
from ), "%Y-%m-%d %k") < ?', [$before]);
. Проблема здесь в том, что sqlite не имеет функций STR_TO_DATE
или CONCAT
, которые есть в MySQL. Поэтому PHPUnut выдает кучу ошибок из-за этого.
Вместо этого моим решением было использование БД MySQL в качестве тестовой БД. Но это, похоже, не работает, так как я получаю несколько разных ошибок, в основном у меня есть несколько тестов, где ограничение внешнего ключа не удается.
Одним из примеров этого является то, что у меня есть следующий метод в моем базовом TestCase setUp
:
if (Schema::hasTable('gym_schedule') && !empty(GymSchedule::createGymSchedules())) {
$this->artisan('db:seed', ['--class' => 'GymScheduleTableSeeder']);
}
Это происходит каждый раз, кроме первого, потому что говорится, что a schedùle with id 1
уже существует (id
- мой первичный ключ). Я попытался обрезать все таблицы между каждым классом теста, используя tearDown
, но это не помогло, а также тестирование стало очень медленным, примерно 3 секунды для каждого теста.
Так что в принципе этот подход тоже не работает.
Я в растерянности. Я попытался погуглить это и поиск через StackOverflow. Я открыт для любых предложений, которые не слишком сложны (либо удалите все функции MySQL каким-либо образом, решите проблему использования MySQL или что-нибудь еще на самом деле).
У кого-нибудь есть хорошая идея?