我想测试一个委托不会抛出FooException
,但我不在乎它是否会抛出其他任何东西。因此我不能使用Nothing
约束。NUnit约束不会抛出特定异常的代理
约束模型没有这样的事情:
Assert.That(del, Throws.Not.InstanceOf<FooException>()); //can't use Not like this
这有可能以某种方式?
我想测试一个委托不会抛出FooException
,但我不在乎它是否会抛出其他任何东西。因此我不能使用Nothing
约束。NUnit约束不会抛出特定异常的代理
约束模型没有这样的事情:
Assert.That(del, Throws.Not.InstanceOf<FooException>()); //can't use Not like this
这有可能以某种方式?
这是稍微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一样成功。
在语法中缺少更直接的测试方法反映了开发人员的意见 - 至少在当时 - 您应该始终知道您期望的异常。
感谢所有不同的选择!至少有一种情况你可能不知道,当你测试警卫/支票报表时。如果数据不好,我知道它会抛出什么(但不关心,只关心它以不良数据的特定方式响应)。 – grokky
看起来像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();
}
}
您是否试图捕获异常并确认它不是'FooException'的实例?有些东西看起来像这样:'Assert.IsNotInstanceOf(exc)' –
@GeorgeAlexandria是的,这就是我正在做的事情,但它很混乱。我希望有一个内置的方式来做到这一点。 – grokky