2015-04-24 2 views
1

Я могу сделать очень простой интеграционный тест, используя capybara, чтобы проверить правильность отображения страницы. К сожалению, тесты могут пройти, даже если есть ошибка, если тест обнаруживает нужное содержимое на странице ошибки.Capybara проходит тесты с ошибками на странице

Пример теста:

scenario 'goes to "new booking" page' do 

    visit '/bookings/new' 

    expect(page).to have_content('Driver') 

end 

Вот пример вывода для неудачного теста, что только случилось не потому, что тестируемая строка не была на странице ошибки:

Failure/Error: expect(page).to have_content('Invited') 
     expected to find text "Invited" in "TypeError at /bookings/86703360-4d92-4b79-bdfd-bbfbf843143e =========================================================== > no implicit conversion of nil into String app/models/vehicle.rb, line 11 ------------------------------ ``` ruby 6 has_many :drivers, through: :workables 7 8 has_and_belongs_to_many :job_types 9 10 def name_with_user > 11 name + \" \" + name_of_user 12 end 13 14 def name_with_user_and_jobs 15 name + \" \" + name_of_user + \" jobs\" 16 end ``` App backtrace ------------- - app/models/vehicle.rb:11:in `name_with_user' - app/views/bookings/show.html.erb:17:in `_app_views_bookings_show_html_erb__3294924100850065400_70296497966640' - app/controllers/bookings_controller.rb:115:in `show' - spec/features/booking_spec.rb:18:in `block (2 levels) in ' Full backtrace -------------- - app/models/vehicle.rb:11:in `name_with_user' - app/views/bookings/show.html.erb:17:in `_app_views_bookings_show_html_erb__3294924100850065400_70296497966640' - actionpack (4.0.8) lib/action_view/template.rb:143:in `block in render' - activesupport (4.0.8) lib/active_support/notifications.rb:161:in `instrument' - actionpack (4.0.8) lib/action_view/template.rb:141:in `render' - actionpack (4.0.8) lib/action_view/renderer/template_renderer.rb:49:in `block (2 levels) in render_template' - actionpack (4.0.8) lib/action_view/renderer/abstract_renderer.rb:38:in `block in instrument' - activesupport (4.0.8) lib/active_support/notifications.rb:159:in `block in instrument' 
+0

Мы всегда должны стараться избегать использования очень широкого #has_content? такие проверки. Они ОЧЕНЬ склонны к ложным срабатываниям плюс они медленны. Постарайтесь максимально ограничить область применения до одного элемента с помощью селектора css. – tgf

ответ

2

Вы можете обернуть текст в поверочных/делах и испытаниях для текста в селекторе, например, для:

have_css("#status", text: "Invited") #not tested 

http://www.rubydoc.info/gems/capybara/0.4.0/Capybara/Node/Matchers

+0

Итак, это работает, потому что селектор CSS не отображается на странице ошибки, только если страница отображается правильно? Умная! –

+0

Вы также можете проверить html страницы с ошибкой и проверить, нет ли на странице какого-то определенного элемента, но я это выше, намного лучше. – Michal

0

Думаю, вы можете использовать within. Пример:

within('.some-css-class') { expect(page).to have_content 'some content' } 

Таким образом, вы можете сузить свой поиск на конкретный div или на любое другое с помощью селекторов css.