2012-08-03 114 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