在MiniTest的assert_raises
/ must_raise
中检查异常消息的预期语法是什么?
我正在尝试做出如下所示的断言,其中"Foo"
是预期的错误消息:
proc { bar.do_it }.must_raise RuntimeError.new("Foo")
答案 0 :(得分:138)
您可以使用assert_raises
断言或must_raise
期望。
it "must raise" do
assert_raises RuntimeError do
bar.do_it
end
-> { bar.do_it }.must_raise RuntimeError
lambda { bar.do_it }.must_raise RuntimeError
proc { bar.do_it }.must_raise RuntimeError
end
如果你需要在错误对象上测试一些东西,你可以从断言或期望中得到它:
describe "testing the error object" do
it "as an assertion" do
err = assert_raises RuntimeError { bar.do_it }
assert_match /Foo/, err.message
end
it "as an exception" do
err = ->{ bar.do_it }.must_raise RuntimeError
err.message.must_match /Foo/
end
end
答案 1 :(得分:20)
断言异常:
assert_raises FooError do
bar.do_it
end
断言异常消息:
根据API doc,assert_raises
返回匹配的异常,以便您查看消息,属性等。
exception = assert_raises FooError do
bar.do_it
end
assert_equal('Foo', exception.message)
答案 2 :(得分:6)
Minitest不提供(还)您检查实际异常消息的方法。但是你可以添加一个辅助方法来执行它并扩展ActiveSupport::TestCase
类以在rails测试套件中的任何地方使用,例如:
在test_helper.rb
class ActiveSupport::TestCase
def assert_raises_with_message(exception, msg, &block)
block.call
rescue exception => e
assert_match msg, e.message
else
raise "Expected to raise #{exception} w/ message #{msg}, none raised"
end
end
并在您的测试中使用它,如:
assert_raises_with_message RuntimeError, 'Foo' do
code_that_raises_RuntimeError_with_Foo_message
end
答案 3 :(得分:0)
为了添加一些最近的发展,过去 pcl::PointXYZ a(0, 1, 2), b(10, 20, 30), c;
c.getArray3fMap() = a.getArray3fMap() + b.getArray3fMap();
std::cout << "c=" << c << std::endl;
//c=(10,21,32)
c.getArray3fMap() = a.getArray3fMap() * b.getArray3fMap();
std::cout << "c=" << c << std::endl;
//c=(0,20,60)
已经some discussions向最小的人添加assert_raises_with_message
而没有太多运气。
目前,有promising pull request等待合并。如果合并,我们将能够使用assert_raises_with_message
而无需自己定义。
与此同时,还有一个名为minitest-bonus-assertions的方便小宝石,它定义了这个方法,以及其他一些方法,以便您可以开箱即用。有关详细信息,请参阅docs。