2017-07-16 140 views
1

我想测试一个委托不会抛出FooException,但我不在乎它是否会抛出其他任何东西。因此我不能使用Nothing约束。NUnit约束不会抛出特定异常的代理

约束模型没有这样的事情:

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

这有可能以某种方式?

+0

您是否试图捕获异常并确认它不是'FooException'的实例?有些东西看起来像这样:'Assert.IsNotInstanceOf (exc)' –

+0

@GeorgeAlexandria是的,这就是我正在做的事情,但它很混乱。我希望有一个内置的方式来做到这一点。 – grokky

回答

2

这是稍微awkwar d但应该这样做

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>()); 

这工作,因为不主张在所有IS一样成功。

在语法中缺少更直接的测试方法反映了开发人员的意见 - 至少在当时 - 您应该始终知道您期望的异常。

+0

感谢所有不同的选择!至少有一种情况你可能不知道,当你测试警卫/支票报表时。如果数据不好,我知道它会抛出什么(但不关心,只关心它以不良数据的特定方式响应)。 – grokky

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(); 
    } 
}