сделать два запроса к одному и тому же контроллеру в спецификации интеграции rails - PullRequest
17 голосов
/ 21 октября 2011

У меня проблема с выполнением двух запросов на один и тот же 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

Если я делаю два запроса к одному и тому же контроллеру, тест, похоже, сохраняет старый ответ ...

В приведенном выше примере, если я раскомментирую эту строку, тесты прерываются, потому что он сохраняет результат первого 'запроса'

Это ограничение стека тестов или я что-то не так делаю?

Ответы [ 4 ]

2 голосов
/ 11 ноября 2011

С простым старым набором тестов Rails функциональные тесты предназначены для одного запроса, и если вы хотите протестировать потоки, вы должны использовать интеграционные тесты (вы можете сбросить контроллер в функциональных тестах).

Спецификации контроллера из rspec-rails наследуются от функциональных тестов Rails, поэтому они имеют то же ограничение. Вы можете использовать rspec с капибарой или вебратом (я рекомендую первый) для интеграционных тестов.

Кроме того, последние версии rspec-rails имеют «спецификации запросов», которые «смешиваются в поведении интеграционных тестов Rails»: https://github.com/rspec/rspec-rails

1 голос
/ 04 ноября 2011

Использование Capybara вместо rspec - лучшее решение для (запроса) интеграционных тестов. Он использует тот же синтаксис, что и rspec, и разрешает несколько запросов в одном блоке it. Я использую rspec для модульного тестирования и капибару для интеграционного тестирования.

https://github.com/jnicklas/capybara

1 голос
/ 31 октября 2011

Интеграционные тесты рельсов должны быть написаны так, чтобы в одном случае тестировался один единственный запрос - цикл ответа. мы можем проверить перенаправления. но если вам нужно сделать что-то вроде

получить '/ что-то', {: status => 'any_other'}, @header

получить '/ что-то', {: status => 'ok'}, @ header

Вы должны написать два разных случая для этого.

0 голосов
/ 17 июня 2016

Вы должны очистить переменные вашего экземпляра или, возможно, единственную необходимую.Давайте представим, что вы используете @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 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...