2016-01-28 15 views
17

Wie kann ich Ausnahmen in einem Testfall mit NUnit3 testen?Testen auf Ausnahmen mit [TestCase] ​​-Attribut in NUnit 3?

Lassen Sie uns sagen, ich habe eine Methode Divide(a,b) wie folgt definiert:

public double Divide(double a, double b) 
{ 
    if(Math.Abs(b) < double.Epsilon) throw new ArgumentException("Divider cannot be 0"); 
    return a/b; 
} 

ich diese Methode mit NUnit 3.0 Testfälle testen wollen, vielleicht habe ich:

[TestCase(-10, 2, -5)] 
[TestCase(-1, 2, -0.5)] 
public void TestDivide(double a, double b, double result) 
{ 
    Assert.That(_uut.Divide(a, b), Is.EqualTo(result)); 
} 

Gibt es eine Möglichkeit, einen Testfall anzugeben, der bewirkt, dass Divide() eine ArgumentException auslöst und diese wie erwartet hat, z etwas entlang der Linien von:

[TestCase(-10, 2, -5)] 
[TestCase(-1, 2, -0.5)] 
[TestCase(-1, 0, ExpectedResult = TypeOf(ArgumentException)] 
public void TestDivide(double a, double b, double result) 
{ 
    Assert.That(_uut.Divide(a, b), Is.EqualTo(result)); 
} 

(Natürlich, ich könnte ein separates Testverfahren definieren und Assert.Throws() in diesen, so ist dies rein aus Neugier)

Antwort

20

ExpectedException wäre die richtige Methode für NUnit gewesen 2.X, aber es wurde von NUnit entfernt 3.

es gibt einen verschiedenen Schnipsel der Diskussion in den NUnit Google Group und die äquivalenten Gruppe Dev - aber es sieht aus wie die Entscheidung getroffen wurde, dass es in der Regel ein besseres Design-Muster erwartete Ergebnisse zu testen und Ausnahmen in separaten Methoden. (link)

Der einzige Weg, dies in NUnit 3 zu tun, wäre es in zwei separate Tests zu unterteilen. (Bestätigt in einer ähnlichen Frage des NUnit Kernteam beantwortet, here.)

[TestCase(-10, 2, -5)] 
[TestCase(-1, 2, -0.5)] 
public void TestDivide(double a, double b, double result) 
{ 
    Assert.That(_uut.Divide(a, b), Is.EqualTo(result)); 
} 

[TestCase(-1, 0)] 
public void TestDivideThrows(double a, double b) 
{ 
    Assert.That(() => _uut.Divide(a, b), Throws.TypeOf<ArgumentException>()); 
} 
+1

Wenn Sie wirklich die beiden in einem einzigen Testfall zwingen wollten, könnten Sie ein boolean throwsException Argument hinzufügen und testen. Das Vorhandensein eines Wenn-dann-sonst und zweier ganz anderer Erwartungen würde jedoch beweisen, dass dies wirklich zwei verschiedene Tests sein sollten. – Charlie

+1

Die niedrigere Syntax scheint auf meinem System (NUnit 3.2.1) nicht zu funktionieren, wenn ich einen statischen Methodenaufruf verwende ... - witzigerweise, Assert.Throws (() => MyStaticClass.MyStaticMethod (badparameter)) 'funktioniert. – ChriPf

+0

Danke @ChriPf - Ich denke, es sollte ein Func sein. Ich habe es bearbeitet. – Chris

Verwandte Themen