如果我想测试一个方法抛出特定类型的异常,则NUnit的ExpectedException属性并不关心实际的类型。如果我在方法调用之前抛出泛型异常,则测试通过:
[Test, ExpectedException(typeof(TestCustomException))]
public void FirstOnEmptyEnumerable()
{
throw new Exception(); // with this, the test should fail, but it doesn't
this.emptyEnumerable.First(new TestCustomException());
}
如果要检查测试是否抛出了确切的异常类型,则必须执行以下手动操作:
[Test]
public void FirstOnEmptyEnumerable()
{
try
{
throw new Exception(); // now the test fails correctly.
this.emptyEnumerable.First(new TestCustomException());
}
catch (TestCustomException)
{
return;
}
Assert.Fail("Exception not thrown.");
}
我想念什么吗?
最佳答案
我从未使用过ExpectedException,所以我没有任何经验可分享。一种选择是断言它直接抛出在测试内部。像这样:
[Test]
public void FirstOnEmptyEnumerable()
{
Assert.Throws<TestCustomException>(() => this.emptyEnumerable.First(new TestCustomException()));
}
我发现这种方法更具可读性,因为您可以准确地在预期的位置测试异常,而不是说“在此函数中的某个地方,除了抛出异常外”。