NUnit的TestCustomException不关心异常类型

时间:2010-10-18 07:10:37

标签: c# .net exception nunit

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

我错过了什么吗?

3 个答案:

答案 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