web-dev-qa-db-ja.com

RSpecのshould_raiseをあらゆる種類の例外で使用する方法は?

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

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

どうすればいいですか?

some_method.should_raise exception

...動作しません。

211
marcgg
expect { some_method }.to raise_error

RSpec 1構文:

lambda { some_method }.should raise_error

ドキュメント (RSpec 1構文の場合)および RSpec 2ドキュメント を参照してください。

380
Avdi

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_errorraise_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_errorraise_exceptionのエイリアスです。

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

RSpec 2:

RSpec 1:

86

ラムダの代わりに、expectを使用して:

   expect { some_method }.to raise_error

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

詳しくは doco をご覧ください。

84
racc

構文は最近変更され、現在は次のとおりです。

expect { ... }.to raise_error(ErrorClass)
65
ayckoster

バージョン3.3以降のrspec-expections gemでは、パラメーターなしの空のraise_errorに対して警告が発生します

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

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

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

4
Bruno E.