RubyTest::Unit
にはがありassert_nothing_raised
ます。MiniTestTest::Unit
に置き換えられました。MiniTestのアサーション/期待がこれと平行していないのはなぜですか?たとえば、期待することはできますが、期待することはできません。must_raise
wont_raise
3 に答える
MiniTestはassert_nothing_raised
、Test :: Unit互換性レイヤーに実装されていますが、独自のテスト(MiniTest::Unit
およびMiniTest::Spec
)では、このようなテストは実装されていません。その理由は、プログラマーは、何も提起されていないかどうかをテストすることは、何もテストしないことだと主張しています。例外をテストする場合を除いて、テストで何かが発生することを期待することはありません。テストのコードで予期しない(キャッチされない)例外が発生した場合、テストによって適切な順序で例外が報告され、問題があることがわかります。
例:
require 'minitest/autorun'
describe "something" do
it "does something" do
Ooops
end
end
出力:
Run options: --seed 41521
# Running tests:
E
Finished tests in 0.000729s, 1371.7421 tests/s, 0.0000 assertions/s.
1) Error:
test_0001_does_something(something):
NameError: uninitialized constant Ooops
untitled:5:in `block (2 levels) in <main>'
1 tests, 0 assertions, 0 failures, 1 errors, 0 skips
それはまさにあなたが知りたかったことです。あなたが何も起こらないことを期待していたなら、あなたはそれを受け取らなかった、そしてあなたはそう言われた。
したがって、ここでの引数は次のとおりです。使用しないでくださいassert_nothing_raised
!それはただの無意味な松葉杖です。たとえば、次を参照してください。
https://github.com/seattlerb/minitest/issues/70
https://github.com/seattlerb/minitest/issues/159
http://blog.zenspider.com/blog/2012/01/assert_nothing_tested.html
一方で、多くの人が一緒に行くことをassert_nothing_raised
期待しているので、明らかにユーザー間の直感に対応しています。特に、単なるテストではなく、これにアサーションを集中させたいと考えています。幸い、MiniTestは非常にミニマリストで柔軟性があるため、独自のルーチンを追加する場合は可能です。したがって、例外がないかどうかをテストし、例外がない場合は既知の結果を返すメソッドを作成できます。これで、その既知の結果をアサートできます。wont_raise
must_raise
たとえば(これが完璧だと言っているのではなく、アイデアを示しているだけです):
class TestMyRequire < MiniTest::Spec
def testForError # pass me a block and I'll tell you if it raised
yield
"ok"
rescue
$!
end
it "blends" do
testForError do
something_or_other
end.must_equal "ok"
end
end
重要なのは、これが良いアイデアでも悪いアイデアでもないということではなく、MiniTestがあなたに代わってそれを行う責任は決してなかったということです。
必要な場合:
# test_helper.rb
module Minitest::Assertions
def assert_nothing_raised(*)
yield
end
end
そしてそれを使用するには:
def test_unknown_setter
assert_nothing_raised do
result.some_silly_column_name = 'value'
end
end
これは、MiniTestソースを掘り下げて、spec_helper.rb
ファイルに実装を提供するのに十分なほど気になりました。
module MiniTest
module Assertions
def refute_raises *exp
msg = "#{exp.pop}.\n" if String === exp.last
begin
yield
rescue MiniTest::Skip => e
return e if exp.include? MiniTest::Skip
raise e
rescue Exception => e
exp = exp.first if exp.size == 1
flunk "unexpected exception raised: #{e}"
end
end
end
module Expectations
infect_an_assertion :refute_raises, :wont_raise
end
end
これが、も必要としている他の誰かに役立つことを願っていますwont_raise
。乾杯!:)