Выполнение двух запросов к одному контроллеру в спецификациях интеграции 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'