如果我想测试一个方法抛出特定类型的异常,NUnit的ExpectedException属性并不关心实际类型;如果我在方法调用之前抛出一个通用的Exception,则测试通过:
[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.");
}
我错过了什么吗?
答案 0 :(得分:4)
我从未使用过ExpectedException,所以我没有任何经验可以分享。一个选项是Assert它直接在测试中抛出。像这样:
[Test]
public void FirstOnEmptyEnumerable()
{
Assert.Throws<TestCustomException>(() => this.emptyEnumerable.First(new TestCustomException()));
}
我发现这种方法更具可读性,因为你准确地测试异常的位置,而不是说“除了要抛出的异常之外,我在这个函数中的某个地方”。
答案 1 :(得分:0)
我总是测试异常的字符串表示,例如:
[Test, ExpectedException("Your.Namespace.TestCustomException")]
public void FirstOnEmptyEnumerable()
{
throw new Exception(); // with this, the test should fail, but it doesn't
this.emptyEnumerable.First(new TestCustomException());
}
这似乎对我有用。
答案 2 :(得分:0)
如果要使用ExpectedException(string)签名,最佳做法是使用typeof(Exception).Name和typeof(Exception).Namespace