7

有没有办法强制黄瓜场景失败?

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

使用下面的代码可以做到这一点,但是有一个问题。一旦我在失败中提出异常!函数,然后 cucumber 停止运行 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

有没有更好的方法在不引发异常的情况下使黄瓜测试失败?

4

2 回答 2

8

您可以使用正常的断言使 after 挂钩失败。对 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
于 2012-08-03T14:30:48.277 回答
3

只是一个初步的答案,因为我还不能检查出来,但我假设调用Raise总是保证会停止执行(除非它是在 proc 或 lambda 中完成的,所以它的评估被推迟了)。

尝试简单

if page.has_selector?(:dialog_message, 1, :text => 'Error')
    scenario.fail!(StandardError.new('Unexpected Error Dialog!'))
end
logout
于 2012-08-03T13:59:02.833 回答