如果我想测试一个方法抛出特定类型的异常,则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()));
}


我发现这种方法更具可读性,因为您可以准确地在预期的位置测试异常,而不是说“在此函数中的某个地方,除了抛出异常外”。

10-06 07:18