Ruby 修改Cumber步骤定义以提供更有用的输出

Ruby 修改Cumber步骤定义以提供更有用的输出,ruby,cucumber,rspec2,Ruby,Cucumber,Rspec2,编写了一个步骤定义,该定义使用集合中的rspec检查CSS元素。如果一个期望失败了,整个场景就会爆炸,我甚至没有得到关于每个CSS元素是否存在的唯一反馈(很遗憾,这是全部还是全部,我不希望这样) 我有以下代码: Then(/^I should see the following css selectors:$/) do |table| css_selectors = table.raw css_selectors.each do |selector| browser.elemen

编写了一个步骤定义,该定义使用集合中的rspec检查CSS元素。如果一个期望失败了,整个场景就会爆炸,我甚至没有得到关于每个CSS元素是否存在的唯一反馈(很遗憾,这是全部还是全部,我不希望这样)

我有以下代码:

Then(/^I should see the following css selectors:$/) do |table|
  css_selectors = table.raw
  css_selectors.each do |selector|
    browser.element(:css=>selector.to_s).exists?.should be_true
  end
end
如果我测试一个大的元素列表,即:

Then I should see the following css selectors:
  |input#foo|
  |.bar     |
  |h#baz    |
  |span.batz|

如果任何元素不存在,我就会有问题。救命啊

您不能在场景中调用
fail


请参阅:

您可以向故障添加自定义消息,其中包括发生故障的选择器。这是通过将第二个参数传递给
should
方法完成的:

Then(/^I should see the following css selectors:$/) do |table|
  css_selectors = table.raw
  css_selectors.each do |selector|
    css_selector = selector[0].to_s
    browser.element(:css=>css_selector).exists?.should be_true, "Element not found: #{css_selector}"
  end
end
这将产生如下错误消息:

Element not found: input#foo (RSpec::Expectations::ExpectationNotMetError)
如果还希望确保所有选择器都已运行,则必须运行每个选择器,收集结果并对结果组执行断言

Then(/^I should see the following css selectors:$/) do |table|
  css_selectors = table.raw

  # Collect any failed selectors
  failed_selectors = []
  css_selectors.each do |selector|
    css_selector = selector[0].to_s
    failed_selectors << css_selector unless browser.element(:css=>css_selector).exists?
  end

  # Check that none of the selectors failed
  failed_selectors.should be_empty, "The following elements were not found #{failed_selectors.join(', ')}"
end
然后(/^我应该看到以下css选择器:$/)do |表|
css_选择器=table.raw
#收集所有失败的选择器
失败的\u选择器=[]
css|选择器。每个do|选择器|
css_selector=选择器[0]。到
失败的选择器。是否存在?
结束
#检查所有选择器是否均未失败
failed_selectors.should_empty,“未找到以下元素35;{failed_selectors.join(',')}”
结束

hmm.试过了。不太管用。再看看。这看起来是一个很好的解决方案,我记得我在阅读rspecTry更新的答案时了解到了这一点。我认为问题在于
选择器。to_s
返回
[input\foo]
,这会弄乱选择器。您需要执行额外的
[0]
来获取表行的第一个元素。如果不是这样的话,你能详细说明一下“没用”吗。不过,如果“input”foo不存在,它不会检查
.bar | h | baz | span.batz |
对不起,您没有意识到您还想确保所有选择器都经过测试。答案更新,以确保所有选择器都经过测试。这太棒了。谢谢贾斯汀!