1

MiniTest 仕様を使用して、コードが特定の例外を発生させることを次のようにテストできます。

proc { foo.do_bar }.must_raise SomeException

しかし、特定の例外が何であるかは気にしません。例外がスローされることを確認したいだけです。私または別の開発者が Foo#do_bar によってスローされる例外を変更することを決定した場合、予想される例外が一般的に十分に指定されていれば、テストを変更する必要はありません。

つまり、次のようにテストを書きたいと思います (Exception はクラス SomeException の祖先です)。

proc { foo.do_bar }.must_raise Exception

これにより、テストを実行すると失敗します。

[Exception] exception expected, not
Class: <SomeException>

例外に関して、Minitest 仕様をより一般的に記述できますか?

(特定の例外ではなく、例外をチェックしたい実際の理由は、サードパーティのGemを使用していて、そのコードが例外を発生させるためです。実際、私のメソッドAはサードパーティによって呼び出されますメソッド B. A は MyException を発生させますが、B はその例外をキャッチし、別の例外を再発生させます. この例外には、私の例外と同じメッセージがあります [そして、このメッセージはテストで確認する必要があるものです] が、別のクラスです. )

4

2 に答える 2

2
describe 'testing' do
  it 'must raise' do
   a = Proc.new {oo.non_existant}
   begin
     a[]
   rescue => e
   end
   e.must_be_kind_of Exception
  end
end

とにかく、これはあなたが求めているものにかなり近いはずです。

于 2013-07-24T04:16:23.043 に答える
0

これは奇妙な動作のようです。

から: http://bfts.rubyforge.org/minitest/MiniTest/Assertions.html#method-i-assert_raises

# File lib/minitest/unit.rb, line 337
def assert_raises *exp
  msg = "#{exp.pop}\n" if String === exp.last

  should_raise = false
  begin
    yield
    should_raise = true
  rescue MiniTest::Skip => e
    details = "#{msg}#{mu_pp(exp)} exception expected, not"

    if exp.include? MiniTest::Skip then
      return e
    else
      raise e
    end
  rescue Exception => e
    details = "#{msg}#{mu_pp(exp)} exception expected, not"
    assert(exp.any? { |ex|
             ex.instance_of?(Module) ? e.kind_of?(ex) : ex == e.class
           }, exception_details(e, details))

    return e
  end

  exp = exp.first if exp.size == 1
  flunk "#{msg}#{mu_pp(exp)} expected but nothing was raised." if
    should_raise
end

これは、渡された例外がのインスタンスであることを確認します。Moduleもしそうなら、のインスタンスは親切ですがモジュールの場合にのみ機能するためe.kind_of?(ex)、正常に機能する使用を使用します。例外に混入した一般的なものである必要があります。SomeExceptionExceptionexException

(ここに示すようにhttp://ruby-doc.org/core-2.0/Object.html#method-i-kind_of-3F

これは、ミニテスト自身のテストに一致します...

  module MyModule; end
  class AnError < StandardError; include MyModule; end

  ....

  def test_assert_raises
    @tc.assert_raises RuntimeError do
      raise "blah"
    end
  end

  def test_assert_raises_module
    @tc.assert_raises MyModule do
      raise AnError
    end
  end

(から: https://github.com/seattlerb/minitest/blob/master/test/minitest/test_minitest_unit.rb )

したがって、例外がモジュールに混在している場合は、モジュールでアサートできます..しかし、それ以外は@vgoffの回答を使用するか、minitestを拡張して必要なことを行います.

注: ruby​​ がすべてオープンソースであることが気に入っています。

于 2013-07-24T07:33:26.390 に答える