RSpec2 и Capybara

Капибара меня смущает. Если я использую Capybara в сочетании с Ruby on Rails 3 и RSpec 2, то в тестах RSpec-запроса работает следующий помощник:
response.body.should have_selector "div.some_class"

Объект ответа имеет класс ActionDispatch::TestResponse. Но следующая строка, которая должна работать официально, не работает:

page.should have_selector "div.some_class"

Объект страницы имеет класс Capybara::Session. В каких случаях вам нужно использовать объект response.body и когда вам нужно использовать объект page?

Ответ 1

Итак, я просто столкнулся с подобным, и я думаю, что происходит:

Это зависит от кода, который вы не указали здесь, как вы посещаете страницу. Я пишу спецификацию запроса rspec.

Если я получаю страницу с помощью rspec own:

get '/some/path'

then response.body.should have_selector работает, как вы говорите, но page.should does not.

Чтобы сделать работу страницы Capybara (и сделать взаимодействия Capybara, такие как click_button или fill_in), вместо того, чтобы получать с помощью rspec 'get', вам нужно получить с помощью Capybara 'visit':

visit '/some/path'
page.should have_selector("works")

'page', метод capybara, устанавливается только при использовании "посещения", метода capybara.

Это запутывает, все смешивание и сопоставление различных библиотек, участвующих в тестировании рельсов.

Ответ 2

Вы должны использовать response, если хотите использовать стандартные методы рельсов. И, альтернативно, вы должны использовать page, если хотите использовать методы capybara. В capybara вы, скорее всего, используете have_css в приведенном примере.