W cucumberze często pisze się scenariusze tego typu:
Given I have no articles
When I add new article titled "First!"
Then I should be on articles list
And I should see "First!"
Fajny i prosty scenariusz, ale może prowadzić do błędów. Na przykład: klient prosi, żeby dodać po prawej w sidebarze najpopularniejsze artykuły. Jako, że w czasie wykonywania takiego scenariusza w bazie jest tylko jeden artykuł, to będzie on widniał zarówno na liście artykułów jak i najpopularniejszych artykułów. Dlatego jeżeli podczas jakiejś refaktoryzacji przez pomyłkę coś się stanie z listą artykułów, to test może dalej przechodzić, a tak naprawdę nie powinien.
Na WRUGU powiedziałem, że używam do tego Nokogiri, ale szukam lepszego rozwiązania. W domu przejrzałem kod i stwierdziłem, że jest to tak naprawdę całkiem niezłe rozwiązanie
Przypuśćmy, że testujemy wyszukiwarkę:
And I should see "First article." in the search results
Jest to wbrew pozorom banalne do zaimplementowania:
[code]# helper, który będzie zwracał Document nokogiri
def nokogiri_doc
wkładamy w nokogiri HTML, przykłąd dla celerity
Nokogiri::HTML($browser.document.asXml)
end
teraz sam krok
Then /^I should see “([^”]*)" in the search results$/ do |text|
content = nokogiri_doc.css("#search_results").to_s
content.should contain(text)
end[/code]
Jak widać można to całkiem prosto zaimplementować. Można by nawet pójść krok dalej i napisać coś w stylu
I should see "some text" in "#search_results"
Z tym, że szczerze mówiąc ja bym nie tego nie polecał, bo pisząc bardziej generalny krok ułatwiamy sobie pracę, ale żadna nietechniczna osoba nie będzie wiedziała dlaczego niby tam jest jakiś # i po co to podkreślenie.
Można zawsze uprościć jeszcze helpery:
[code]def element_content(css)
content = nokogiri_doc.css("#search_results").to_s
end
Then /^I should see “([^”]*)" in the search results$/ do |text|
element_content("#search_result").should contain(text)
end[/code]
W tym wypadku do wszystkiego wystarczy jednolinijkowy krok, więc pisania jest niedużo a zysk chyba całkiem niezły
Zna ktoś jakieś lepsze rozwiązanie?