Behat 3 и Laravel, среда тестирования не соблюдается


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

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

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

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

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

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

РЕДАКТИРОВАТЬ: Я вижу проблему - я использую Guzzle для тестирования API, и в то время как функции настройки Behat работают над тестированием env, как только Guzzle в игре, приложение понятия не имеет, что оно тестирует env. Поэтому мне либо нужно найти способ сообщить приложению, что оно находится в тестировании env, либо сказать бехату, чтобы он использовал env разработки.

Author: Adamski, 2014-09-01

2 answers

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

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

 3
Author: Ian Bytchek, 2014-09-02 08:41:30

В свой 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 (так что вы также можете использовать свои модели).

 1
Author: FooBar, 2015-01-12 16:55:17