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)
但两者都会导致未处理的异常。我在这里缺少什么?
更新似乎其他人无法重现这一点。这是一个屏幕截图:
调试器指出您的异常没有由用户代码处理,这在技术上是正确的。为了进行演示,我将使用提供的示例测试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)
| 归档时间: |
|
| 查看次数: |
8475 次 |
| 最近记录: |