Ich bin komplett neu bei C# und NUnit.Ist NUnits ExpectedExceptionAttribute nur eine Möglichkeit zu testen, ob etwas eine Ausnahme auslöst?
In Boost.Test gibt es eine Familie von BOOST_*_THROW
Makros. In Pythons Testmodul gibt es TestCase.assertRaises
Methode.
Soweit ich es verstehe, in C# mit NUnit (2.4.8) ist die einzige Methode, Ausnahme-Test zu tun, ExpectedExceptionAttribute
zu verwenden.
Warum sollte ich ExpectedExceptionAttribute
über - sagen wir - Boost.Test Ansatz bevorzugen? Welche Argumentation kann hinter dieser Designentscheidung stehen? Warum ist das bei C# und NUnit besser?
Schließlich, wenn ich beschließe, ExpectedExceptionAttribute
zu verwenden, wie kann ich einige zusätzliche Tests durchführen, nachdem die Ausnahme ausgelöst und abgefangen wurde? Nehmen wir an, ich möchte die Anforderung testen, dass das Objekt gültig sein muss, nachdem ein Setzer System.IndexOutOfRangeException
ausgelöst hat. Wie würden Sie den folgenden Code reparieren und wie erwartet arbeiten?
[Test]
public void TestSetterException()
{
Sth.SomeClass obj = new SomeClass();
// Following statement won't compile.
Assert.Raises("System.IndexOutOfRangeException",
obj.SetValueAt(-1, "foo"));
Assert.IsTrue(obj.IsValid());
}
Edit: Vielen Dank für Ihre Antworten. Heute habe ich eine Es sind die Testsblog entry, wo alle drei von Ihnen beschriebenen Methoden erwähnt werden (und eine kleinere Variante). Es ist schade, dass ich es nicht vor :-(finden konnte
Will nicht Assert.Fail ("...") dump Sie aus dem Test mit einer AssertionFailedException? –
Ja. Wenn der Aufruf von SetValueAt jedoch eine Ausnahme auslöst (was wir erreichen möchten), wird die Steuerung sofort in den catch-Block verschoben und umgeht Assert.Fail, wodurch der Test bestanden wird. Wenn SetValueAt keine Ausnahme auslöst, ist das Verhalten nicht so, und der Test sollte fehlschlagen. – yfeldblum
Das ist besser als meine Art, es zu tun. Ich werde deinen Ansatz in Zukunft verwenden :) –