【发布时间】:2012-01-14 12:28:52
【问题描述】:
我正在为 MVC Web 应用程序编写单元测试,但我收到了空引用异常,因为模拟的测试对象仅部分初始化。我知道哪一行抛出了异常,它看起来像这样:
return Supervisor.RegistrationInformation.Registrations
.Any(r =>
r.RegistrationCountry.IsUSAOrCandada() &&
(!DatesWorked.Start.HasValue || r.RegistrationDate <= DatesWorked.Start.Value) &&
(!DatesWorked.End.HasValue || r.RegistrationExpirationDate >= DatesWorked.End.Value) &&
//...
那里有很多参考资料,其中任何一个都可能是问题所在。然而,NullReferenceException 本身似乎并没有捕捉到哪个引用被炸毁了。我传入 lambda 的事实带来了另一个挑战:据我所知,我无法在调试期间单步执行 lambda 并查看 r 的哪些成员为空。
我有什么办法可以做到以下一项或两项:
- 让 Visual Studio 准确告诉我是哪个引用抛出了
NullReferenceException? - 如果做不到这一点,有没有办法让调试器在
Any评估它时单步执行 lambda 表达式(或将鼠标悬停在事物上以查看它们的值)?
我觉得一定有办法做这些事情,但我似乎找不到。我使用的是 VS2010 Premium,并且安装了 Resharper、VS Power Tools 和其他几个扩展。如果有一个插件可以做到这一点,我会很好的。
编辑:
正如 Eric Lippert 所指出的,在发布配置中编译代码时,不可能查明 NR 异常的来源。我只是询问在调试模式下工作。如果 Visual Studio(或 VS 的某些扩展)可以在调试时跟踪引用的来源,那将回答我的问题。
编辑 2:
第二个问题——如何打破和单步执行 lambda——已经得到解答,但我仍然想知道是否有自动方法来追踪空引用。
【问题讨论】:
-
不,没有办法做到这一点,除非 ReSharper 可以提供帮助。
-
你有没有试过把 lambda 改成匿名函数并在里面放断点?
-
启用第一次机会异常处理(Debug => Exceptions)并在抛出 NullReferenceException 时中断?
-
将代码分解成更小的部分,每个部分只有一个引用。
-
您可以在 lambda 中设置断点——只是不能以通常的方式(单击装订线将断点包含语句,而不是 lambda 的内部)。您必须将光标放在 lambda 内并按 F9 - 然后您将在 lambda 内获得一个断点。
标签: c# visual-studio debugging resharper nullreferenceexception