Заглушка `session_id` в интеграционных тестах Rails

У меня вопрос об интеграционных тестах Rails. У меня есть это приложение, которое разговаривает с другим внутренним приложением.

Приложение делает запрос к internal_app, и один из параметров этого запроса включает session_id, хранящийся в файле cookie сеанса. По разным причинам запросы к внешним службам заглушаются с помощью гемов webmock и vcr. Это записывает запрос/ответ в файл фикстуры, так что при следующем запуске запроса он попадет в файл фикстуры, а не в реальную службу.

Моя проблема в том, что session_id меняется каждый раз при запуске теста. Это означает, что, согласно webmock, сделанный запрос не соответствует заглушенному запросу, что приводит к проваленному тесту. В тестах контроллера я могу получить прямой доступ к сеансу и изменить/заглушить все, что захочу, по желанию. С интеграционными тестами я не могу получить доступ к сеансу напрямую, и поэтому я застрял, используя любой session_id, сгенерированный Rails для теста. Кто-нибудь знает хороший способ изменить/заглушить session_id для интеграционных тестов на что-то ожидаемое? Есть несколько менее предпочтительных способов, которые я рассматриваю (например, отказ от драгоценного камня vcr для этих интеграционных тестов), но я бы предпочел найти способ, чтобы вместо этого session_id был некоторым ожидаемым значением.

Тесты выполняются с помощью Capybara/Poltergeist/phantomjs в приложении Rails 5.1.


person mc92    schedule 29.06.2018    source источник


Ответы (1)


Вы действительно не должны заглушать внутренности вашего приложения во время интеграционных тестов, так как это действительно лишает смысла интеграционные тесты. Однако вы можете настроить VCR так, чтобы он игнорировал session_id, используя параметр :match_requests_onhttps://relishapp.com/vcr/vcr/docs/request-matching — при сопоставлении запроса и последующем использовании динамических кассет — https://relishapp.com/vcr/vcr/v/3-0-3/docs/cassettes/dynamic-erb-cassettes - чтобы вставить правильный session_id в ответ, если это необходимо

person Thomas Walpole    schedule 29.06.2018
comment
Спасибо за это. Я попробую. Мне любопытно, как бы вы подошли к проблеме заглушки/не заглушки? Интеграционный тест по-прежнему попадает на контроллер, и контроллер по-прежнему выполняет код, который пытается сделать запрос к внешней службе. В этом случае я думаю, что внешний запрос на обслуживание все еще должен быть заглушен? - person mc92; 30.06.2018