Za pomocą:
Ruby: ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux]
Rails: 3.2.9
Capybara: 2.0.3
Mam aplikację Rails, w której znajduje się link, który po kliknięciu powinien wysłać żądanie wiadomości AJAX i zwrócić odpowiedź JS.
Kod łącza:
link_to("Send Notification", notification_path(user_id: user_id), remote: true, method: :post)
Odpowiedź JS (plik .js.haml) powinna przełączać następujące ukryte div na stronie, do której istnieje łącze:
Zawartość pliku js.haml:
:plain
var notificationStatusContainer = $('#notification_status');
notificationStatusContainer.val("#{@notification_status_msg}");
notificationStatusContainer.show();
Testowałem mój scenariusz wysyłania powiadomienia i wyświetlania komunikatu o statusie powiadomienia do użytkownika za pomocą Cucumber ( klejnot ogórków z wbudowaną obsługą Kapibary )
Próbowałem sprawdzić, czy element mający id: notification_status był widoczny po pomyślnej odpowiedzi w mojej definicji kroku, w tym celu wypróbowałem następujące stwierdzenia:
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)
Żaden z powyższych nie zadziałał dla mnie i nie wykonał mojego kroku. Z 5 wymienionych powyżej fragmentów ostatnie 4 zakończyły się niepowodzeniem z następującym błędem:
'expected to find css "#notification_status" but there were no matches. Also found "", which matched the selector but not all filters. (Capybara::ExpectationNotMet)'
co było dziwne, ponieważ następujące stwierdzenie zostało przekazane poprawnie:
page.has_selector?('#notification_status')
I faktycznie sprawdziłem źródło strony używając
print page.html
który się pojawił
<div style='' id='notification_status'></div>
co było oczekiwane.
Wreszcie znalazłem ten link kapibara assert atrybuty elementu, który pokazał, jak sprawdzić atrybut elementu w sposób surowy.
Znalazłem też w dokumentacji Kapibary widoczne? metoda ( http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Element#visible%3F-instance_method ) następujące informacje:
Not all drivers support CSS, so the result may be inaccurate.
W ten sposób doszedłem do wniosku, że testując widoczność pierwiastka nie opierasz się na wynikach widzialności Kapibary? przy użyciu selektora CSS i rozwiązania sugerowanego w link capybara assert atrybuty elementu
Wymyśliłem:
module CustomMatchers
def should_be_visible(css_selector)
find(css_selector)['style'].should_not include('display:none', 'display: none')
end
end
World(CustomMatchers)
Stosowanie:
should_be_visible('#notification_status')