Quelle est la syntaxe attendue pour la vérification des messages d'exception dans le assert_raises
/must_raise
du MiniTest?
J'essaie de faire une affirmation semblable à celle-ci, où "Foo"
est le message d'erreur attendu:
proc { bar.do_it }.must_raise RuntimeError.new("Foo")
Vous pouvez utiliser le assert_raises
assertion ou le 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 RuntimeError
end
Si vous avez besoin de tester quelque chose sur l'objet d'erreur, vous pouvez l'obtenir à partir de l'assertion ou de l'attente de la manière suivante:
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
Pour affirmer une exception:
assert_raises FooError do
bar.do_it
end
Pour affirmer un message d'exception:
Conformément à doc d'API , assert_raises
renvoie l'exception vérifiée afin que vous puissiez vérifier le message, les attributs, etc.
exception = assert_raises FooError do
bar.do_it
end
assert_equal('Foo', exception.message)
Minitest ne vous fournit pas (encore) un moyen de vérifier le message d'exception réel. Mais vous pouvez ajouter une méthode d'assistance qui le fait et étendre la classe ActiveSupport::TestCase
à utiliser partout dans votre suite de tests Rails, par exemple :.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
et utilisez-le dans vos tests comme:
assert_raises_with_message RuntimeError, 'Foo' do
code_that_raises_RuntimeError_with_Foo_message
end
Pour ajouter quelques développements plus récents, il y a eu quelques discussions sur l'ajout de assert_raises_with_message
à minitest dans le passé sans trop de chance.
Actuellement, il y a une demande d'attraction prometteuse en attente de fusion. Si et quand il sera fusionné, nous pourrons utiliser assert_raises_with_message
sans avoir à le définir nous-mêmes.
En attendant, il y a ce petit bijou pratique nommé minitest-bonus-assertions qui définit exactement cette méthode, ainsi que quelques autres, de sorte que vous puissiez l'utiliser immédiatement. Voir le docs pour plus d’informations.