2016-01-28 14 views
17

Jak przetestować wyjątki w TestCase z NUnit3?Testowanie wyjątków za pomocą atrybutu [TestCase] ​​w NUnit 3?

Powiedzmy mam metoda Divide(a,b) zdefiniowane następująco:

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

Chcę przetestować tę metodę przy użyciu NUnit 3,0 przypadków testowych, więc może mam:

[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)); 
} 

Czy istnieje sposób, aby określić przypadek testowy, który spowoduje, że Divide() wyrzuci wyjątek ArgumentException i jakoś to będzie miało oczekiwany wynik, np. coś wzdłuż linii:

[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)); 
} 

(Oczywiście mógłbym zdefiniować oddzielne metody badawczej i używać Assert.Throws() w tym, więc jest to czysto z ciekawości)

Odpowiedz

20

ExpectedException byłby poprawny sposób NUnit 2.X, ale został usunięty z NUnit 3.

Istnieje wiele fragmentów dyskusji w NUnit Google Group i równoważnej grupie Dev - ale wygląda na to, że podjęto decyzję, że ogólnie jest to lepszy wzór do testowania oczekiwanych rezultatów i wyjątki w osobnych metodach. (link)

Jedynym sposobem, aby to zrobić w NUnit 3, byłoby podzielenie go na dwa osobne testy. (Potwierdzone w podobnym pytaniem odpowiedział przez rdzeń zespołu NUnit, 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

Jeśli naprawdę chciał wymusić dwa w jednym przypadku testowego, można dodać logiczną throwsException argument i go przetestować. Obecność jednak - jeśli nie - i dwóch całkowicie odmiennych oczekiwań świadczy o tym, że tak naprawdę powinny to być dwa różne testy. – Charlie

+1

Niższa składnia wydaje się nie działać na moim systemie (NUnit 3.2.1) podczas korzystania ze statycznego wywołania metody ... - wystarczająco zabawne, 'Assert.Throws (() => MyStaticClass.MyStaticMethod (badparameter)) 'działa. – ChriPf

+0

Dzięki @ChriPf - Myślę, że powinien to być func. Zmontowałem to. – Chris

Powiązane problemy