Выполнение двух запросов к одному контроллеру в спецификациях интеграции rails
У меня возникла проблема с двумя запросами на один и тот же URL-адрес в тесте интеграции rails, с rspec
it 'does something' do
# get '/something', {:status=>'any_other'}, @header ## <<<<< this line couses problem!
get '/something', {:status=>'ok'}, @header
doc = Nokogiri::HTML(response.body)
lis = doc.css('#the_id')
lis.size.should == 1
lis[0].text.should include('anything')
end
Если я делаю два запроса одному контроллеру, тест, похоже, поддерживает старый ответ...
В приведенном выше примере, если я раскомментирую эту строку, тест прерывается, потому что он поддерживает результат первого "запроса"
Это ограничение тестового стека, или я делаю что-то неправильно?
Ответы
Ответ 1
С обычным тестовым набором Rails функциональные тесты предназначены для одного запроса, и если вы хотите протестировать потоки, вы должны использовать тесты интеграции (вы можете reset контроллер в функциональных тестах).
Спецификации контроллера от rspec-rails наследуют функциональные тесты Rails, поэтому они имеют одинаковые ограничения. Вы можете использовать rspec с capybara или webrat (я рекомендую первый) для тестов интеграции.
Кроме того, в последних версиях rspec-rails есть "спецификации запросов", которые "смешиваются в поведении тестов интеграции Rails": https://github.com/rspec/rspec-rails
Ответ 2
тесты интеграции рельсов должны быть записаны так, чтобы в случае тестирования один цикл запроса-ответа. мы можем проверить перенаправления. но если вам нужно сделать что-то вроде
get '/something', {: status = > 'any_other'}, @header
get '/something', {: status = > 'ok'}, @header
Вы должны написать для этого два разных случая.
Ответ 3
Использование Capybara вместо rspec является лучшим решением для (запроса) тестов интеграции. Он использует тот же синтаксис, что и rspec, и разрешает несколько запросов в одном блоке. Я использую rspec для модульного тестирования и capybara для тестирования интеграции.
https://github.com/jnicklas/capybara
Ответ 4
Вам нужно очистить переменные экземпляра или, возможно, только необходимые.
Предположим, что вы используете @book
в своем контроллере.
get '/something'
assert ...
controller.instance_variable_set(:@book, nil)
get '/something'
assert ...
Если вы используете inherit_resources
get '/something'
assert ...
controller.send(:set_resource_ivar, nil)
get '/something'
assert ...
Ответ 5
Я не думаю, что проблема в том, что вы получаете один и тот же ответ, а в том, что вы фактически отправляете один и тот же запрос дважды.
Следующее работает для меня, когда я хочу сделать два запроса в одном тесте:
@request.delete_header 'RAW_POST_DATA'