在MiniTest的assert_raises / must_raise中检查exception消息的期望语法是什么?

在MiniTest的assert_raises / must_raise检查exception消息的期望语法是什么?

我试图做出如下的断言,其中"Foo"是预期的错误信息:

 proc { bar.do_it }.must_raise RuntimeError.new("Foo") 

您可以使用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 

如果你需要在错误对象上testing一些东西,你可以从断言或期望中得到它,例如:

 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 

断言exception:

 assert_raises FooError do bar.do_it end 

断言exception信息:

根据API文档 , assert_raises返回匹配的exception,以便检查消息,属性等。

 exception = assert_raises FooError do bar.do_it end assert_equal('Foo', exception.message) 

Minitest不提供(你)的方式来检查实际的exception信息。 但是你可以添加一个辅助方法来实现它,并且扩展ActiveSupport::TestCase类以在你的Railstesting套件中的任何地方使用,例如:in 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 

并在你的testing中使用它:

 assert_raises_with_message RuntimeError, 'Foo' do code_that_raises_RuntimeError_with_Foo_message end 

为了增加一些更新的发展,过去没有太多的运气,已经有一些关于向assert_raises_with_message添加assert_raises_with_message 讨论 。

目前,还有一个有希望的拉动请求正在等待合并。 如果和合并时,我们将能够使用assert_raises_with_message而不必自己定义它。

与此同时,这个方便的小gem命名为minitest-bonus-assertions ,它确切地定义了这个方法以及其他一些方法,以便您可以使用它。 有关更多信息,请参阅文档 。