web-dev-qa-db-fra.com

Tester les exceptions avec l'attribut [TestCase] ​​dans NUnit 3?

Comment puis-je tester les exceptions dans un TestCase avec NUnit3?

Disons que j'ai une méthode Divide(a,b) définie comme suit:

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

Je veux tester cette méthode à l'aide de cas de test NUnit 3.0, alors j'ai peut-être:

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

Existe-t-il un moyen de spécifier un cas de test qui amènera Divide () à lever une ArgumentException et à avoir cela en quelque sorte comme résultat attendu, par exemple quelque chose comme:

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

(Bien sûr, je pourrais définir une méthode de test distincte et utiliser Assert.Throws() dans ce cas, donc c'est purement par curiosité)

29
Corpus Gigantus

ExpectedException aurait été la bonne méthode pour NUnit 2.X, mais elle a été supprimée de NUnit 3.

Il y a plusieurs extraits de discussion dans NUnit Google Group et le groupe Dev équivalent - mais il semble que la décision a été prise qu'il s'agit généralement d'un meilleur modèle de conception pour tester les résultats attendus et des exceptions dans des méthodes distinctes. ( lien )

La seule façon de le faire dans NUnit 3 serait de le décomposer en deux tests distincts. (Confirmé dans une question similaire répondue par l'équipe de base de NUnit, ici .)

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