Ruby on rails Cucumber,如何检查家长是否有某个类?

Ruby on rails Cucumber,如何检查家长是否有某个类?,ruby-on-rails,cucumber,capybara,Ruby On Rails,Cucumber,Capybara,我正在将cucumber与rails一起使用,并且我正在检查元素的父元素是否具有特定的类。我找到了这个代码,但它不起作用。顺便说一下,我正在用水豚。提前谢谢 Then the element "([^"]*)" with parent "([^"]*)" should have class "([^"]*)" do |element_id,parent,css_class| response.should have_selector "#{parent} .#{css_class}" do

我正在将cucumber与rails一起使用,并且我正在检查元素的父元素是否具有特定的类。我找到了这个代码,但它不起作用。顺便说一下,我正在用水豚。提前谢谢

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

从技术上讲,这并不是你测试cucumber的方法。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,这会导致非常不可读的特性,而且还要混合传入元素名、类名和元素ID——每个都有稍微不同的样式。。。在这一步中,元素可以是任何类型的选择器,而父类和css_类则固定得多——它们必须始终“适合”选择器字符串,否则它将找不到任何内容

我没有真正的解释清楚,但是简单地说,你应该考虑你真正想要测试的,并考虑它是否可以被重新命名为更有用和更有用的东西。您是否能够在不查看其实现的情况下重复使用该步骤,从而找出要执行的内容

此外,使用更具表现力的命名,测试在以后的测试中会立即变得更有用。例如,步骤
Then我应该看到当前列表是活动的
可读性和表达性强得多,那么带有父级“ul”的元素“li.active”应该具有类“active list”
。在步骤定义实现中要具体,而不是您的功能

读一读这篇博文——它会让你对如何写更好的步骤有一个很好的了解