1

ruby-1.9.3 を使って...

ブロックと Procs に関する正規のブログ投稿をいくつか読みましたが、これら 2 つの状況が異なる理由がわかりません。

module TestHelpers
  def bad_arg_helper(&scenario)

    # this works fine, test passes (without the next line)
    assert_raise ArgumentError, "wrong type of arguments, pass Fixnum or Range parameters", { Myclass.myfunc "bad" }

    # even though the exception is correctly raised in myfunc, this assert does not see it and the test fails
    assert_raise ArgumentError, "wrong type of arguments, pass Fixnum or Range parameters", scenario.call
  end
end

class TestClass < Test::Unit::TestCase
  include TestHelpers

  def test_bad_args
    bad_arg_helper { Myclass.myfunc "bad" }
  end
end

ブロックを別のモジュールのテスト ヘルパーに渡すにはどうすればよいですか?

4

1 に答える 1

2

コード内の 3 つのバリアントを参照してください。

require 'test/unit'
class Myclass
  def self.myfunc(par)
    raise ArgumentError unless par.is_a?(Fixnum)
  end
end

module TestHelpers
  def bad_arg_helper(&scenario)

    # this works fine, test passes (without the next line)
    assert_raise( ArgumentError, "wrong type of arguments, pass Fixnum or Range parameters") { Myclass.myfunc "bad" }

    # even though the exception is correctly raised in myfunc, this assert does not see it and the test fails
    assert_raise( ArgumentError, "wrong type of arguments, pass Fixnum or Range parameters", &scenario)
    assert_raise( ArgumentError, "wrong type of arguments, pass Fixnum or Range parameters") { yield }
    assert_raise( ArgumentError, "wrong type of arguments, pass Fixnum or Range parameters") { scenario.call }
  end
end

class TestClass < Test::Unit::TestCase
  include TestHelpers

  def test_bad_args
    bad_arg_helper { Myclass.myfunc "bad" }
  end
end
于 2012-07-01T18:17:43.423 に答える