在 NUnit 3 中使用 [TestCase] 属性测试异常?
Testing for exceptions with [TestCase] attribute in NUnit 3?
如何使用 NUnit3 在 TestCase 中测试异常?
假设我有一个方法 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()
,所以这纯粹是出于好奇)
ExpectedException
本来是 NUnit 2.X 的正确方法,但它已从 NUnit 3 中删除。
NUnit Google Group and the equivalent Dev group - but it looks like the decision was made that it's generally a better design pattern to test expected outcomes, and exceptions in separate methods. (link)
中有各种讨论片段
在 NUnit 3 中执行此操作的唯一方法是将其分解为两个单独的测试。 (在 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>());
}
我同意 Corpus Gigantus 的回答,但你为什么不简化一下:
[TestCase(-10, 2, -5)]
[TestCase(-1, 2, -0.5)]
[TestCase(-1, 0, null, typeof(ArgumentException))]
public void TestDivide(double a, double b, double result, Type exception = null)
{
if(exception != null)
{
Assert.Throws(exception, delegate { _uut.Divide(a, b); });
} else Assert.That(_uut.Divide(a, b), Is.EqualTo(result));
}
这样,预期的异常也是测试参数的一部分,注意你只能有两个结果,除法成功或抛出。
如何使用 NUnit3 在 TestCase 中测试异常?
假设我有一个方法 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()
,所以这纯粹是出于好奇)
ExpectedException
本来是 NUnit 2.X 的正确方法,但它已从 NUnit 3 中删除。
NUnit Google Group and the equivalent Dev group - but it looks like the decision was made that it's generally a better design pattern to test expected outcomes, and exceptions in separate methods. (link)
中有各种讨论片段在 NUnit 3 中执行此操作的唯一方法是将其分解为两个单独的测试。 (在 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>());
}
我同意 Corpus Gigantus 的回答,但你为什么不简化一下:
[TestCase(-10, 2, -5)]
[TestCase(-1, 2, -0.5)]
[TestCase(-1, 0, null, typeof(ArgumentException))]
public void TestDivide(double a, double b, double result, Type exception = null)
{
if(exception != null)
{
Assert.Throws(exception, delegate { _uut.Divide(a, b); });
} else Assert.That(_uut.Divide(a, b), Is.EqualTo(result));
}
这样,预期的异常也是测试参数的一部分,注意你只能有两个结果,除法成功或抛出。