Was ist die erwartete Syntax zum Überprüfen von Ausnahmemeldungen in assert_raises / must_raise von MiniTest?

86

Was ist die erwartete Syntax zum Überprüfen von Ausnahmemeldungen in MiniTests assert_raises/ must_raise?

Ich versuche, eine Aussage wie die folgende zu machen, wobei "Foo"die erwartete Fehlermeldung angezeigt wird:

proc { bar.do_it }.must_raise RuntimeError.new("Foo")
kfitzpatrick
quelle
Siehe auch
Factor Mystic

Antworten:

148

Sie können die assert_raisesBehauptung oder die must_raiseErwartung verwenden.

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

Wenn Sie etwas an dem Fehlerobjekt testen müssen, können Sie es aus der Behauptung oder Erwartung wie folgt abrufen:

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
Blowmage
quelle
Cool, das verstehe ich. Ich weiß jedoch immer noch nicht, wie ich eine Aussage über die Meldung des ausgelösten Fehlers machen soll.
Kfitzpatrick
3
err = -> {bar.do_it} .must_raise Die RuntimeError-Syntax hat bei mir nicht funktioniert. Die folgende Ausnahme wurde immer wieder ausgelöst. NoMethodError: undefinierte Methode `assert_raises 'für nil: NilClass
thanikkal
2
@thanikkal Stellen Sie sicher, dass Sie verwenden Minitest::Specund nicht Minitest::Test. Das Spec DSL, einschließlich der Erwartungen, ist nur bei Verwendung verfügbar Minitest::Spec.
Blowmage
28

So behaupten Sie eine Ausnahme:

assert_raises FooError do
  bar.do_it
end

So bestätigen Sie eine Ausnahmemeldung:

Wie pro API doc , assert_raisesgibt die Ausnahme angepasst , so dass Sie die Nachricht überprüfen, Attribute, usw.

exception = assert_raises FooError do
  bar.do_it
end
assert_equal('Foo', exception.message)
Jing Li
quelle
7

Minitest bietet Ihnen (noch) keine Möglichkeit, die tatsächliche Ausnahmemeldung zu überprüfen. Sie können jedoch eine Hilfsmethode hinzufügen und die ActiveSupport::TestCaseKlasse so erweitern, dass sie überall in Ihrer Rails-Testsuite verwendet werden kann, z. B.: Intest_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

und verwenden Sie es in Ihren Tests wie:

assert_raises_with_message RuntimeError, 'Foo' do
  code_that_raises_RuntimeError_with_Foo_message
end
Entwickler
quelle
2
Es stimmt, dass Minitest das Überprüfen der Fehlermeldung nicht unterstützt. Dies kann jedoch mithilfe von erreicht werden, must_raiseda Sie die Fehlerinstanz erhalten, sodass Sie die Nachricht selbst überprüfen können.
Bithavoc
1
Diese Lösung fühlt sich für mich besser an, aber ich habe sie noch nicht verwendet must_raise.
Pumazi
Ich denke, dass diese Lösung nicht fehlschlagen wird, wenn keine Ausnahme ausgelöst wird. Sie überprüfen nur die ausgelöste Ausnahme, um die richtige zu sein. Wenn jedoch keine Ausnahme ausgelöst wird, erfolgt keine Zusicherung => keine Fehler.
Foton
guter Punkt @Foton Ich habe die Antwort geändert, um diese Erwartung widerzuspiegeln.
Entwickler
0

Um einige neuere Entwicklungen hinzuzufügen, gab es in der Vergangenheit einige Diskussionen über das Hinzufügen assert_raises_with_messagezu Minitest ohne viel Glück.

Derzeit gibt es eine vielversprechende Pull-Anfrage, die darauf wartet, zusammengeführt zu werden. Wenn und wann es zusammengeführt wird, können wir es verwenden, assert_raises_with_messageohne es selbst definieren zu müssen.

In der Zwischenzeit gibt es dieses praktische kleine Juwel namens Minitest-Bonus-Assertions , das genau diese Methode definiert, zusammen mit einigen anderen, so dass Sie sie sofort verwenden können. Weitere Informationen finden Sie in den Dokumenten .

Kostas Rousis
quelle