Тестирование исключений с атрибутом [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>());
}