2010-03-01 73 views
26

我試圖預期rspec測試中的錯誤。期望rspec測試中的錯誤

lambda {Participant.create!({:user_id => three.id, :match_id => match.id, :team => 1})}.should raise_error StandardError 

現在我只是用StandardError來確定它的工作。

1) StandardError in 'Participant should never allow more participants than players'. 
    This game is already full. Cannot add another player. 
/home/josiah/Projects/Set-Match/app/models/participant.rb:12:in `do_not_exceed_player_count_in_match' 
./spec/models/participant_spec.rb:24: 

它顯然會引發錯誤,但我的測試仍然失敗。

想法?

回答

34

您的語法看起來正確。要進行調試,請簡化以確保您的規範編碼正確。

it "should raise an error" do 
    lambda {raise "boom"}.should raise_error 
end 

然後添加更多的細節,直到它休息。

lambda {raise "boom"}.should raise_error(RuntimeError) 
lambda {raise StandardError.new("boom")}.should raise_error(StandardError) 
+0

感謝您的提示。 – 2010-03-02 05:45:33

5

我有相同的症狀,要擺

def boom 
    raise "boom" 
end 
boom.should raise_error 

測試上面,因爲raise_error要求should要在Proc叫失敗(由於技術上的原因,我想)。因此,包裝方法調用與拉姆達工作得很好:

lambda { boom }.should raise_error 

不幸的是,文件並沒有說明確,也沒有揭示這種行爲RSpec的異常。這是一個two year old ticket

+2

「boom.should raise_error」失敗,因爲在做「應該」之前評估繁榮。另一方面,lambda被「應該」本身調用。 – grilix 2011-10-27 19:43:51

45

由於一些時間,但至少在RSpec的2.5,它是能夠使用

expect {raise 'boom'}.to raise_error(RuntimeError, /boom/)