Тестирование исключений с атрибутом [TestCase] ​​в NUnit 3?

Как проверить исключения в TestCase с помощью NUnit3?

Скажем, у меня есть метод Divide(a,b), который определяется следующим образом:

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

Я хочу протестировать этот метод с использованием тестовых примеров NUnit 3.0, поэтому, возможно, у меня есть:

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

Есть ли способ указать тестовый пример, который приведет к тому, что Divide() вызовет исключение ArgumentException и каким-то образом получит это как ожидаемый результат, например. что-то вроде:

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

(Конечно, я мог бы определить отдельный тестовый метод и использовать Assert.Throws() в этом, так что это чисто из любопытства)

Ответы

Ответ 1

ExpectedException был бы правильным методом для NUnit 2.X, но он был удален из NUnit 3.

Существуют различные фрагменты обсуждения в NUnit Google Group и эквивалентной группе Dev, но похоже, что было принято решение о том, что оно вообще лучший шаблон проектирования для проверки ожидаемых результатов и исключения из отдельных методов. (ссылка)

Единственный способ сделать это в NUnit 3 - разбить его на два отдельных теста. (Подтвержденный в подобном вопросе отвечает основной командой NUnit, здесь.)

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