如何强迫黄瓜方案失败?

时间:2012-08-03 13:55:29

标签: ruby cucumber capybara

有没有办法强迫黄瓜方案失败?

我需要在每次测试结束时检查一些失败的情况。所以我认为我可以检查一个“错误”对话框,然后如果它发生就失败了测试。

这可以使用下面的代码,但是有问题。一旦我在失败中提出异常!函数,然后黄瓜停止运行After钩子的其余部分,因此注销函数不会被调用。

当时:

After() do |scenario|  
  #Checking for Error popups
  if page.has_selector?(:dialog_message, 1, :text => 'Error')
    fail!(raise(ArgumentError.new('Unexpected Error dialog!')))
  end
  logout
end

现在:

After() do |scenario|  
  #Checking for Error popups
  if page.has_selector?(:dialog_message, 1, :text => 'Error')
    scenario.fail!(logout)
  end
end

是否有更好的方法可以在没有异常的情况下使黄瓜测试失败?

2 个答案:

答案 0 :(得分:8)

使用正常的断言可以使挂钩失败。对Capybara / rspec例外没有做太多,但我认为你可以这样做:

page.should have_selector?(:dialog_message, 1, :text => 'Error')

但是,如果您这样做或执行scenario.fail!(),您仍然无法注销。您需要将其包装在begin-ensure块中。

试试这个:

After do |scenario|
    begin
        page.should have_selector?(:dialog_message, 1, :text => 'Error')
    ensure
        logout
    end
end

<强>更新

如果您不想调用标准断言并直接使方案失败,则可以执行以下操作 - 您需要使用fail而不是fail!

After() do |scenario|  
  begin 
    #Checking for Error popups
    if page.has_selector?(:dialog_message, 1, :text => 'Error')
      fail(ArgumentError.new('Unexpected Error dialog!'))
      #Or you can just do fail('Unexpected Error dialog') if you do not care about the type.
    end
  ensure
    logout
  end
end

答案 1 :(得分:3)

只是一个初步答案,因为我还没有检查出来,但我认为调用Raise始终保证停止执行(除非它在proc或lambda中完成所以它的评估推迟)。

尝试简单

if page.has_selector?(:dialog_message, 1, :text => 'Error')
    scenario.fail!(StandardError.new('Unexpected Error Dialog!'))
end
logout