web-dev-qa-db-ja.com

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:

それは明らかにエラーをスローしますが、私のテストはまだ失敗します。

考え?

27
Josiah Kiehl

構文は正しいようです。これをデバッグするには、仕様が正しくコーディングされていることを確認するために単純化します。

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)
35
Jonathan Julian

しばらくしてから、少なくともRSpec 2.5では、使用することが可能です

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

私は同じ症状で戦わなければなりませんでした:

def boom
  raise "boom"
end
boom.should raise_error

上記のテストは、raise_errorではshouldProcで呼び出す必要があります(技術的な理由からだと思います)。したがって、メソッド呼び出しをラムダでラップすることは問題なく機能します。

  lambda { boom }.should raise_error

残念ながら、ドキュメントにはそれが明示的に記載されておらず、この動作を明らかにするRSpec例外はありません。 2年前のチケット があります。

5
crispy