33

RubyTest::Unitにはがありassert_nothing_raisedます。MiniTestTest::Unitに置き換えられました。MiniTestのアサーション/期待がこれと平行していないのはなぜですか?たとえば、期待することはできますが、期待することはできません。must_raisewont_raise

4

3 に答える 3

50

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_raisemust_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があなたに代わってそれを行う責任は決してなかったということです。

于 2012-09-19T16:48:34.290 に答える
11

必要な場合:

# 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
于 2015-05-11T08:40:21.243 に答える
3

これは、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。乾杯!:)

于 2015-09-01T15:52:31.323 に答える