黄瓜,如何检查父母是否有某个班级?

时间:2011-07-18 09:30:11

标签: ruby-on-rails cucumber capybara

我正在使用带有rails的黄瓜,我正在检查元素的父元素是否具有某个类。我找到了这段代码,但它不起作用。顺便说一下,我正在使用Capybara。提前谢谢!

Then the element "([^"]*)" with parent "([^"]*)" should have class "([^"]*)" do |element_id,parent,css_class|
  response.should have_selector "#{parent} .#{css_class}" do |matches|
    matches.should have_selector element_id
  end
end

1 个答案:

答案 0 :(得分:2)

从技术上讲,这不是你应该用黄瓜测试的方式。黄瓜用于测试行为,而不是检查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,这会产生非常难以理解的功能,但您要混合传递元素名称,类名称和元素ID - 每个都具有略微不同的样式...在此步骤中,元素可以是任何类型的选择器,而parent和css_class更加固定 - 它们必须始终“适合”选择器字符串,否则它将找不到任何东西。

我还没有真正解释过这一点,但简而言之,你应该考虑一下你实际上要测试的内容,并考虑是否可以将其重命名为更有用和可重用的内容。您是否能够重新使用该步骤而不考虑它的实现来找出究竟发生了什么?

此外,通过更具表现力的命名,测试在以后的版本中会立即变得更有用。例如,步骤Then I should see the current list is activeThen the element "li.active" with parent "ul" should have class "active-list"更具可读性和表现力。具体在步骤定义实现中,而不是您的功能!

阅读此博客文章 - http://elabs.se/blog/15-you-re-cuking-it-wrong - 它应该让您对如何编写更好的步骤有所了解。