Каков ожидаемый синтаксис проверки сообщений об исключениях в 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.