57

特定のエラーをスローするモデルの 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 のドキュメントを見ていましたが、有望なものは見つかりませんでした。何か案は?

4

2 に答える 2

120

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

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

assert_raise(Exception) { whatever.merge }

rspec を使用している場合 (残念ながら文書化されていませんが、より一般的です)

lambda { whatever.merge }.should raise_error

発生したものを確認したい場合Exception

exception = assert_raises(Exception) { whatever.merge }
assert_equal( "message", exception.message )
于 2010-08-11T02:54:44.983 に答える
17

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

assert_nothing_raised RuntimeError do
  whatever.merge
end

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

assert_raise RuntimeError do
  whatever.merge
end

注意点として、エラーを発生させる (またはアサーションwhatever.mergeの種類によっては発生させない) コードです。

于 2013-12-04T05:32:14.397 に答える