97 votes

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

Quelle est la syntaxe attendue pour la vérification des messages d'exception dans la fenêtre de MiniTest ? assert_raises / must_raise ?

J'essaie de faire une affirmation du type de la suivante, où "Foo" est le message d'erreur attendu :

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

164voto

blowmage Points 2587

Vous pouvez utiliser le assert_raises ou l'affirmation must_raise l'attente.

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 devez tester quelque chose sur l'objet d'erreur, vous pouvez l'obtenir à partir de l'assertion ou de l'attente comme suit :

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

34voto

Jing Li Points 5289

Pour faire valoir l'exception :

assert_raises FooError do
  bar.do_it
end

Pour affirmer le message d'exception :

Conformément à Document API , assert_raises renvoie l'exception correspondante 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)

8voto

Bogdan Kulbida Points 85

Minitest ne vous fournit pas (encore) un moyen de vérifier le message d'exception réel. Mais vous pourriez ajouter une méthode d'aide qui le fait et étendre la méthode ActiveSupport::TestCase pour l'utiliser partout dans votre suite de test de rails, par ex : dans 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 l'utiliser dans vos tests comme :

assert_raises_with_message RuntimeError, 'Foo' do
  code_that_raises_RuntimeError_with_Foo_message
end

0voto

rkon Points 1847

Pour ajouter quelques développements plus récents, il y a eu quelques discussions sur l'ajout assert_raises_with_message à minitest dans le passé sans beaucoup de chance.

Actuellement, il existe un demande de pull prometteuse qui attendent d'être fusionnés. Si et quand il est fusionné, nous serons en mesure d'utiliser assert_raises_with_message sans avoir à la 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, afin que vous puissiez l'utiliser dès le départ. Voir le docs pour plus d'informations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X