Каков ожидаемый синтаксис проверки сообщений об исключениях в MiniTest assert_raises/must_raise?

Каков ожидаемый синтаксис для проверки сообщений об исключениях в MiniTest assert_raises/must_raise?

Я пытаюсь сделать утверждение вроде следующего, где "Foo" - ожидаемое сообщение об ошибке:

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

Ответ 1

Вы можете использовать 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

Ответ 2

Утвердить исключение:

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)

Ответ 3

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

Ответ 4

Чтобы добавить некоторые более свежие разработки, были некоторые обсуждения о добавлении assert_raises_with_message для миниатюры в прошлом без большой удачи.

В настоящее время существует перспективный запрос на перенос, ожидающий объединения. Если и когда он будет слит, мы сможем использовать assert_raises_with_message, не определяя его сами.

В то же время есть этот удобный маленький жемчуг с именем minitest-bonus-assertions, который точно определяет этот метод вместе с несколькими другими, так что вы можете использовать его из коробки. Дополнительную информацию см. В docs.