NUnit 3:抛出的确切类型也不例外吗?

时间:2018-02-23 16:23:33

标签: c# nunit

如何断言我的代码中抛出完全类型的异常?

两个

Assert.That(testDelegate, Throws.Nothing); // any type of an exception was not thrown

Assert.That(testDelegate, Throws.InstanceOf<ExactException>()); // an exception of needed type was thrown

这里的方法不正确

2 个答案:

答案 0 :(得分:0)

这听起来像你想要的

Assert.That(testDelegate, Throws.TypeOf<ExactException>());

InstanceOf表示&#34;的确切类型或派生类型&#34; - 就像is的工作方式一样。我们使用TypeOf表示它必须是确切的类型。它会创建一个ExactTypeConstraint

OTOH,如果您想进行否定测试(抛出ExactException),那么您就无法使用流畅的语法。您可以直接指定约束表达式,例如......

Assert.That(testDelegate, 
    new NotConstraint(
        new ThrowsConstraint(
            new ExactTypeConstraint(typeof(ExactException)))));

推荐,但它可用。如果我不得不这样做,我会使用Rob的解决方法,但我也会质疑为什么我这样做,并希望找到一种方法来避免出现任何情况例外除了某一个是正常的。

答案 1 :(得分:0)

NUnit没有类似Does.Not.Throw.TypeOf<ExactException>()之类的约束,并且传递/忽略其他异常。测试一个方法不抛出特定异常是一个相当罕见的用例,但如果抛出任何其他异常则传递。对我而言,它是code smell,但如果你真的想这样做,你可以得到你想要的行为,

[Test]
public void DoesNotThrowSpecificException()
{
    try
    {
        MethodThatShouldntThrowExactException(); // But may throw any other exception
    }
    catch (Exception ex)
    {
        Assert.That(ex, Is.Not.TypeOf(typeof(ExactException)));
    }
}