RSpecのshould_raiseをどのように使用するのですか?


211

私はこのようなことをしたいと思います:

some_method.should_raise <any kind of exception, I don't care>

どうすればよいですか?

some_method.should_raise exception

...機能しません。

回答:



88

RSpec 2

expect { some_method }.to raise_error
expect { some_method }.to raise_error(SomeError)
expect { some_method }.to raise_error("oops")
expect { some_method }.to raise_error(/oops/)
expect { some_method }.to raise_error(SomeError, "oops")
expect { some_method }.to raise_error(SomeError, /oops/)
expect { some_method }.to raise_error(...){|e| expect(e.data).to eq "oops" }

# Rspec also offers to_not:
expect { some_method }.to_not raise_error
...

注:raise_errorおよびraise_exceptionは交換可能です。

RSpec 1

lambda { some_method }.should raise_error
lambda { some_method }.should raise_error(SomeError)
lambda { some_method }.should raise_error(SomeError, "oops")
lambda { some_method }.should raise_error(SomeError, /oops/)
lambda { some_method }.should raise_error(...){|e| e.data.should == "oops" }

# Rspec also offers should_not:
lambda { some_method }.should_not raise_error
...

注:raise_errorはのエイリアスですraise_exception

ドキュメント:https : //www.relishapp.com/rspec

RSpec 2:

RSpec 1:


それは素晴らしい答えでした。
ジギー

raise_error(/ oops /)は、例外メッセージの部分文字列をチェックするための優れた方法です
Serge Seletskyy 2013年

1
raise_errorとraise_exceptionは交換可能であることを指摘していただきありがとうございます(y)
Yo Ludke

85

ラムダの代わりに、expect to:を使用します。

   expect { some_method }.to raise_error

これは、rspecの最新バージョン、つまりrspec 2.0以降に適用されます。

詳細については、docoを参照してください。


私はこれをRspec 1には使用しませんが、Rspec 2の場合は正常に機能します。
ericraio 2012年

6
実際、上記のドキュメントリンクによると、これは{some_method} .to raise_error
Guilherme Garnierである

コメントも、リンク先のページも、がにexpect比べて良いか悪いかを説明していませんlambda
Kragen Javier Sitaker 2012

1
期待はrspec 2.0以降です。これにより、ラムダ構文が機能しなくなるため、どちらが優れているかという議論が疑われる
Rob

これはカピバラでは私にとっては機能しません:expect { visit welcome_path }.to raise_error
nnyby


4

rspec-expectionsgemのバージョン3.3から、パラメーターなしで空白のraise_errorの警告が発生します

expect { raise StandardError }.to raise_error # results in warning
expect { raise StandardError }.to raise_error(StandardError) # fine

これにより、コードがテスト用のテストとは異なるエラーで失敗する可能性があるというヒントが得られます。

警告:raise_error特定のエラーまたはメッセージを提供せずにマッチャーを使用すると、誤検出のリスクがありますraise_error。RubyがNoMethodErrorNameErrorまたはを発生させると一致ArgumentErrorするため、呼び出すつもりのメソッドを実行しなくても期待値が渡される可能性があります。代わりに、特定のエラークラスまたはメッセージを提供することを検討してください。このメッセージは、次のように設定することで抑制できますRSpec::Expectations.configuration.warn_about_potential_false_positives = false

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.