What is the expected syntax for checking exception messages in MiniTest's assert_raises/must_raise?
You can use the assert_raises
assertion, or the must_raise
expectation.
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 RuntimeErrorend
If you need to test something on the error object, you can get it from the assertion or expectation like so:
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/ endend
To assert exception:
assert_raises FooError do bar.do_itend
To assert exception message:
As per API doc, assert_raises
returns the exception matched so you can check the message, attributes, etc.
exception = assert_raises FooError do bar.do_itendassert_equal('Foo', exception.message)
Minitest does not provide (yet) you a way to check the actual exception message. But you could add a helper method that does it and extend ActiveSupport::TestCase
class to use everywhere in your rails test suite, e.g.: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" endend
and use it in your tests like:
assert_raises_with_message RuntimeError, 'Foo' do code_that_raises_RuntimeError_with_Foo_messageend