2012-08-03 113 views
7

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

我需要在每次测试结束时检查一些失败的情况。所以我想我可以做一个'错误'对话框的检查,然后在测试发生的时候通过测试。

这是可能的与下面的代码,但有一个问题。一旦我在失败中提出异常!函数,那么黄瓜停止运行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 

有没有一种更好的方式失败黄瓜测试没有引发异常?

回答

8

你可以得到钩后使用常规断言失败。有没有做太多与水豚/ 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 
+0

谢谢贾斯汀,我从来没有想过使用确保块。我希望有一种方法可以让场景失败而不会引发异常。 – snowstreams 2012-08-03 14:55:52

3

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

尽量简单

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

很抱歉,请'scenario.fail( '信息')' – 2012-08-03 14:05:25

+0

谢谢,我至三编辑那里也是。 我得到了错误: 未定义的方法'消息”的‘消息’: 所以,我想这个字符串(NoMethodError): scenario.fail(注销) 这一半的工作。至少它运行了我的注销代码并且未通过测试,但它仍然给出了一条错误消息: 未定义的方法'message'for nil:NilClass(NoMethodError) – snowstreams 2012-08-03 14:16:13

+0

我有点困惑,可能来自哪里 - 你能否更新当前代码导致该错误的问题? – 2012-08-03 14:28:03