Behat 3 и Laravel, испытательная среда, не удостоенная

У меня запуталась проблема с использованием Behat 3 и Laravel для тестирования API.

Похоже, что он не использует базу данных «тестирования» (в моем случае базу данных sqlite памяти) … но только некоторое время.

Я поместил сообщение журнала в файл testing / database.php, чтобы узнать, когда он загружен. И я вижу сообщение журнала при запуске Behat.

Но запуск функций Behat заключается в добавлении строк в мою базу данных разработки, и некоторые из моих тестов не работают по той же причине.

Мои тесты phpunit работают нормально и не изменяют базу данных dev.

Есть ли что-то, что должно быть в behat.yml, что я пропустил?

EDIT: Я вижу проблему – я использую Guzzle для тестирования API, и в то время как функции настройки Behat работают над тестированием env, как только Gozzle в игре, приложение не имеет представления об этом в тестировании env. Таким образом, я либо должен найти способ сказать приложение в тестировании env, либо сказать, что нужно использовать разработку env.

С помощью PHPUnit вы можете настроить среду в бутстрапе, и эта конфигурация будет использоваться на протяжении всего тестирования. С Behat у вас есть другая ситуация, в отличие от PHPUnit, она делает запросы на сервер и напрямую не обращается к вашему Php-коду. Хотя нам, разработчикам, кажется, что мы тестируем код, который находится в следующей папке для наших функций, на самом деле он доступен через наш локальный сервер, который указывает на этот код. Другими словами, вы имеете дело с удаленным кодом, который имеет нулевое воздействие ваших тестов и игнорирует (как и ожидалось) конфигурацию (которую вы все равно настраиваете на свой локальный код).

Таким образом, чтобы передать любую конфигурацию в ваш код, вы должны думать о своем сервере как о точке входа. Существует два основных подхода: используйте два локальных домена для своего приложения (app.dev и app.tst) или сделайте свой app.tst приемлемым для параметра / cookie, который скажет, что он находится под тестом. Первый из них был бы лучшим вариантом, так как вы не добавляете какую-либо логику в свое приложение и можете настраивать переменные среды через конфигурацию сервера или сделать точку домена другой бутстрапом и т. Д.

В свой FeatureContext.php добавьте этот метод:

 /** * @BeforeSuite */ public static function bootstrapLaravel() { $unitTesting = true; $testEnvironment = 'testing'; require __DIR__ . '/../../../bootstrap/start.php'; // adjust this to right path. This will work if FeatureContext.php is in app/tests/acceptance } 

Это будет использовать базу данных тестирования и включить Laravel (так что вы также можете использовать свои модели).