web-dev-qa-db-ja.com

Rails ActiveSupport:エラーが発生したことを表明する方法は?

特定のエラーをスローするモデルの1つで関数をテストしたいと思います。関数は次のようになります。

def merge(release_to_delete)
  raise "Can't merge a release with itself!" if( self.id == release_to_delete.id )
  raise "Can only merge releases by the same artist" if( self.artist != release_to_delete.artist   )
  #actual merge code here
end

次に、これらの各例外を発生させるパラメーターを指定してこの関数を呼び出すと、実際に例外がスローされることをアサートしたいと思います。 ActiveSupportのドキュメントを見ていましたが、有望なものは見つかりませんでした。何か案は?

51
spilliton

したがって、単体テストは実際にはアクティブにサポートされていません。 Rubyには標準ライブラリの標準的なxunitフレームワーク(Ruby 1.8.xのTest :: Unit、Ruby 1.9のMiniTest)が付属しており、activesupportの要素はいくつかの要素を追加するだけです。それ。

Test :: Unit/MiniTestを使用している場合

assert_raise(Exception) { whatever.merge }

rspecを使用している場合(残念ながら不十分に文書化されていますが、はるかに人気があります)

lambda { whatever.merge }.should raise_error

あなたがしたい場合check発生したException

exception = assert_raises(Exception) { whatever.merge }
assert_equal( "message", exception.message )
100
Matt Briggs

例外が発生しない(または正常に処理される)ことを確認するには、テストケース内で行います。

assert_nothing_raised RuntimeError do
  whatever.merge
end

エラーが発生したことを確認するには、テストケース内で次のようにします。

assert_raise RuntimeError do
  whatever.merge
end

頭を上げてください、whatever.mergeは、エラーを発生させるコードです(または、アサーションタイプによっては発生しません)。

15
shivam