web-dev-qa-db-fra.com

Quelle est la syntaxe attendue pour vérifier les messages d’exception dans assert_raises/must_raise de MiniTest?

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")
73
kfitzpatrick

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
132
blowmage

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)
20
Jing Li

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
6
Developer

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. 

0
Kostas Rousis