如何断言 NUnit 中未抛出特定异常?

How to Assert that a specific Exception is not thrown in NUnit?

提问人:furkang68 提问时间:10/25/2023 最后编辑:Guru Stronfurkang68 更新时间:10/26/2023 访问量:44

问:

我正在使用 NUnit 进行测试,并且有一段代码,其中我使用 JObject.Parse(json)。我想确保此代码不会抛出JsonReaderException。这是我尝试过的断言:

Assert.That(() => { JObject.Parse(json); }, Throws.Nothing);

上面的断言仅确认没有抛出异常,但我想特别断言不会抛出 JsonReaderException。有没有办法在 NUnit 中做到这一点?

我尝试过使用诸如 之类的东西,但似乎都不起作用。我希望找到一个 NUnit 断言,允许我检查是否存在特定异常,但找不到执行此操作的方法。Throws.Not.JsonReaderException

C# json .net 单元测试 nunit

评论

0赞 Scott Hannen 10/26/2023
我会考虑断言你希望代码做什么,而不是你希望它不做什么。有时断言您的代码确实会引发特定异常是有意义的。我敢肯定该方法的目的不是为了抛出异常。如果是这样,您可以删除方法的主体,然后它永远不会抛出该异常。

答:

1赞 Zohar Peled 10/25/2023 #1

我不知道有一种内置的直接方法来断言不会抛出特定的异常,但您始终可以在测试方法中使用。
像这样的东西就可以了:
try...catch

try
{
  JObject.Parse(json);
}
catch(JsonReaderException ex)
{
    // This will make the test fail...
    throw;
}
catch(Exception ex)
{
    // ignore or log or whatever, this is just so that the test will pass.
}

这样,任何未通过测试的异常都将通过测试,但不会。JsonReaderExceptionJsonReaderException

4赞 Guru Stron 10/25/2023 #2

只需用以下命令否定约束:!

// Fails:
Assert.That(() => { throw new AggregateException();},
    !Throws.InstanceOf<AggregateException>());

// Passes:
Assert.That(() => { throw new AggregateException();},
    !Throws.InstanceOf<InvalidOperationException>());

Constraint类具有重载运算符,这在某种程度上等同于创建新的。例如,在这种情况下,以下内容也有效:!NotConstraint

Assert.That(() => { throw new AggregateException();},
    new NotConstraint(Throws.InstanceOf<InvalidOperationException>()));

请注意,运算符的当前实现稍微复杂一些

public static Constraint operator !(Constraint constraint)
{
    var r = (IResolveConstraint)constraint;
    return new NotConstraint(r.Resolve());
}