С помощью:
Ruby: ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux]
Rails: 3.2.9
Capybara: 2.0.3
У меня есть приложение Rails, в котором есть ссылка, которая при нажатии должна отправить запрос на отправку AJAX и вернуть ответ JS.
Код ссылки:
link_to("Send Notification", notification_path(user_id: user_id), remote: true, method: :post)
Ответ JS (файл .js.haml) должен переключить следующий скрытый div на странице, на которую существует ссылка:
js.haml содержимое файла:
:plain
var notificationStatusContainer = $('#notification_status');
notificationStatusContainer.val("#{@notification_status_msg}");
notificationStatusContainer.show();
Я тестировал свой сценарий отправки уведомления и отображения сообщения о состоянии уведомления пользователю, используя Cucumber ( драгоценный камень огурцов-рельсов со встроенной поддержкой Capybara. )
Я пытался проверить, что элемент с идентификатором: notification_status был виден при успешном ответе в моем определении шага. Для этого я попробовал следующие утверждения:
page.find('#notification_status').should be_visible
page.should have_selector('#notification_status', visible: true)
page.should have_css('#notification_status', visible: true)
page.find('#notification_status', visible: true)
page.find(:css, 'div#notification_status', visible: true)
Ни одно из вышеперечисленных не сработало для меня и провалило мой шаг. Из перечисленных выше 5 фрагментов последние 4 завершились со следующей ошибкой:
'expected to find css "#notification_status" but there were no matches. Also found "", which matched the selector but not all filters. (Capybara::ExpectationNotMet)'
что было странно, потому что следующий оператор проходил правильно:
page.has_selector?('#notification_status')
И на самом деле я проверил источник страницы, используя
print page.html
который появился
<div style='' id='notification_status'></div>
чего и ожидалось.
Наконец я нашел эту ссылку capybara assert attributes элемента, которая показала, как проверять атрибут элемента в необработанном виде.
Также я нашел в документации Capybara для видимых? метод ( http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element#visible%3F-instance_method ) следующую информацию:
Not all drivers support CSS, so the result may be inaccurate.
Таким образом, я пришел к выводу, что при тестировании видимости элемента не полагаться на результаты Capybara's visible? при использовании селектора CSS и использовании решения, предложенного в ссылке capybara assert атрибутов элемента
Я придумал следующее:
module CustomMatchers
def should_be_visible(css_selector)
find(css_selector)['style'].should_not include('display:none', 'display: none')
end
end
World(CustomMatchers)
Применение:
should_be_visible('#notification_status')