对于不抛出特定异常的委托的NUnit约束

时间:2017-07-16 07:58:09

标签: c# nunit

我想测试一个委托不会抛出FooException,但我不在乎它是否会抛出任何其他内容。因此,我无法使用Nothing约束。

约束模型没有这样的东西:

Assert.That(del, Throws.Not.InstanceOf<FooException>());   //can't use Not like this

这有可能吗?

2 个答案:

答案 0 :(得分:3)

这有点尴尬,但应该这样做

Assert.That(Assert.Catch(del), Is.Null.Or.Not.TypeOf<FooException>());

就个人而言,我更喜欢双线版

var ex = Assert.Catch(del);
Assert.That(ex, Is.Null.Or.Not.TypeOf<FooException>());

或更清晰的三线

var ex = Assert.Catch(del);
if (ex != null)
    Assert.That(ex, Is.Not.TypeOf<FooException>());

这是有效的,因为根本不断言与成功相同。

缺乏一种更直接的方法来在语法中测试这一点反映了开发人员的意见 - 至少在当时 - 你应该总是知道你期望的异常。

答案 1 :(得分:2)

看起来nunit没有开箱即用 但是你有一些解决方法:
您可以使用其他断言框架,例如FluentAssertions, 这允许你做下一个断言:

del.ShouldNotThrow<FooException>();

您也可以编写自己的custom-constraints,例如ThrowsNothingConstraint

或者你可以写自定义metod

public void AssertException<T>(Action act) where T : Exception
{
    try
    {
        act();
    }
    catch (T e)
    {
        Assert.Fail();
    }
    catch (Exception e)
    {
        Assert.Pass();
    }
}