ruby – 斷定在黃瓜中丟擲一個特殊的異常
指令碼
我正在寫一個圖書館(沒有Ruby on Rails),我想要有非常詳細的黃瓜功能.這特別包括描述在各種情況下應該丟擲的錯誤/異常.
例
編寫黃瓜步驟最直觀的方式可能就是這樣
When I do something unwanted Then an "ArgumentError" should be thrown
問題
我必須解決兩個問題:
>丟擲異常時,第一步不應該失敗.
>第一步丟擲的異常應該可以訪問第二步,以做一些斷言魔術.
不合理和繁瑣的解決方案
我可以想出的最好的方法是在第一步中快取異常,並將其放入第二步可以訪問的例項變數中,如下所示:
When /^I do something unwanted$/ do begin throw_an_exception! rescue => @error end end Then /^an "(.*)" should be thrown$/ do |error| @error.class.to_s.should == error end
但是,這樣做在第一步或多或少無用於我不希望失敗的情況,而且需要一個例項變數,這絕對不是一件好事.
所以,任何人都可以幫我一個至少不那麼麻煩的解決方案?或者我應該不同地寫我的功能嗎?任何幫助將不勝感激.
我再想一次,也許答案是:
沒有優雅的解決方案,因為您的案件違反了ofollow,noindex" target="_blank">Given-When-Then 計劃.
你期望“然後一個例外應該被丟擲”是“當我做不需要的東西”的結果.
但是當你想到的時候,這不是真的!這個例外並不是這個動作的結果,實際上這個例外只是表示“When”-Statement failed.
我的解決辦法是在較高層次上進行測試:
When I do something unwanted Then an error should be logged
要麼
When I do something unwanted Then the user should get an error message
要麼
When I do something unwanted Then the program should be locked in state "error"
或這些的組合.
那麼你會在你的程式中“快取異常” – 這是完全有道理的,因為你最有可能需要這麼做.
你所說的兩個問題也會解決.
如果您真的必須測試異常
那麼我猜,那黃瓜不是正確的測試套件,嗯? :wink:
不管怎麼說,由於給予 – 當時的計劃,我只會寫
When I do something unwanted it should fail with "ArgumentError"
並在步驟定義的東西(未經測試,請糾正我,如果你嘗試)
When /^I do something unwanted it should fail with "(.*)"$/ do |errorstring| expect { throw_an_exception! }.to raise_error(errorstring) end
如上所述,這是可怕的錯誤,因為計劃被打破,但它將服務於目的,不是嗎? :wink:
您將在測試錯誤at rspec expectations 找到進一步的文件.
http://stackoverflow.com/questions/9219959/asserting-that-a-particular-exception-is-thrown-in-cucumber