无法让 NUnit 的 Assert.Throws 正常工作

Dav*_*ave 5 nunit dictionary unit-testing exception keynotfoundexception

我可以发誓我已经使用 NUnit 的 Assert.Throws 来确定某个方法是否抛出特定的异常,但我的记忆以前已经失败了。我在 SO 上阅读了这篇文章,但它没有回答我的问题,因为我知道正确的语法,并且我不想对返回的异常执行任何操作(我不想查看异常的成员,尽管这可能会很有用)。

我编写了单元测试来证明我对 Dictionary 的使用缺乏理解,并且无法让它处理抛出的 KeyNotFoundException。我在运行时遇到了未处理的 KeyNotFoundException 错误,而不是 NUnit 捕获它并通过测试。我确认我没有将 VS IDE 设置为在抛出的 .NET 异常时中断。

我尝试过这两种方法:

Assert.Throws( typeof(KeyNotFoundException), () => value = prefs["doesn't exist"]);
Run Code Online (Sandbox Code Playgroud)

Assert.Throws<KeyNotFoundException>( () => value = prefs["doesn't exist"]);
Run Code Online (Sandbox Code Playgroud)

但两者都会导致未处理的异常。我在这里缺少什么?

更新似乎其他人无法重现这一点。这是一个屏幕截图:

替代文本

Ped*_*dro 2

调试器指出您的异常没有由用户代码处理,这在技术上是正确的。为了进行演示,我将使用提供的示例测试sgreeve

[Test]
public void demonstrateThatExceptionThrown()
{
    string value;
    Dictionary<string, string> test = new Dictionary<string, string>();
    Assert.Throws(typeof(KeyNotFoundException), () => value = test["h"]);
}
Run Code Online (Sandbox Code Playgroud)

当您执行它时,您将在 VisualStudio 中收到一条警告,指出用户代码中未处理异常。如果你查看调用堆栈,你会看到类似的内容

[External Code]
CodeTests.DLL!CodeTests.MiscTests.demonstrateThatExceptionThrown.AnonymousMethod()
[External Code]
CodeTests.DLL!CodeTests.MiscTests.demonstrateThatExceptionThrown()
[External Code]
Run Code Online (Sandbox Code Playgroud)

由于您已指定委托,因此异常发生在创建的“AnonymousMethod”内。这是由 .Net 框架调用的。调试器正在停止,因为您的委托在异常传递回框架之前没有处理异常。它不关心堆栈的更上层是否可能在您的代码中进行处理(可能是因为无法保证外部代码能够正确处理异常。)

要让 VisualStudio 将其视为已处理的异常,请使用 ExpectedException 属性并删除委托,如下所示:

[Test]
[ExpectedException(typeof(KeyNotFoundException))]
public void demonstrateThatExceptionThrown()
{
    string value;
    Dictionary<string, string> test = new Dictionary<string, string>();
    value = test["h"];
}
Run Code Online (Sandbox Code Playgroud)