Технически, это не совсем то, что вы должны тестировать с огурцом. Cucumber предназначен для тестирования поведения, а не для проверки DOM - хотя, конечно, его можно использовать таким образом.
Если вы действительно хотите написать что-то вроде этого, вы можете сделать это намного проще:
Then /^the element "([^"]*)" with parent "([^"]*)" should have class "([^"]*)"$/ do |element_id,parent,css_class|
page.should have_css("#{parent}.#{css_class} #{element_id}")
end
Хотя на многих уровнях это отстой. Мало того, что вы проверяете DOM непосредственно с шага, который делает для очень нечитаемых функций, но вы смешиваете передачу имен элементов, имен классов и идентификаторов элементов - каждый с немного другим стилем ... На этом этапе элемент может быть любым типом селектора, тогда как parent и css_class гораздо более фиксированы - они всегда должны «вписываться» в строку селектора, иначе ничего не будет найдено.
Я не очень хорошо объяснил это, но в двух словах, вы должны подумать о том, что вы на самом деле пытаетесь проверить, и подумать, можно ли его переименовать во что-то более полезное и повторно используемое. Сможете ли вы когда-нибудь повторно использовать этот шаг, не глядя на его реализацию, чтобы выяснить, что и где?
Кроме того, с более выразительным наименованием, тест мгновенно становится более полезным в дальнейшем. Например, шаг Then I should see the current list is active
гораздо более читабелен и выразителен, чем Then the element "li.active" with parent "ul" should have class "active-list"
. Будьте конкретны в реализации определения шага, а не в своих возможностях!
Прочитайте это сообщение в блоге - http://elabs.se/blog/15-you-re-cuking-it-wrong - оно должно дать вам хорошее представление о том, как написать более эффективные шаги.