在该程序集中,所有的NUnit测试都被跳过了,因为我在一个引用的项目中添加了一个空参数检查。

5 浏览
0 Comments

在该程序集中,所有的NUnit测试都被跳过了,因为我在一个引用的项目中添加了一个空参数检查。

我遇到了这个问题,即NUnit测试在Resharper的测试运行器中没有执行。经过一次git bisect会话,我确定了造成这个问题的提交,但我无法确定原因;我找到的大部分解决方案都涉及损坏的app.config文件,但我的提交只改变了C#代码。它只在我的一个测试项目(单元测试)失败,而其他测试(集成测试和验收测试,也由NUnit驱动)运行正常。

因此,我尝试了其他的故障排除方法,并按照这个人的故障排除步骤,安装了Visual Studio的NUnit测试适配器,以尝试使用VS而不是R#运行测试。

现在,重新构建整个解决方案并检查测试输出窗口,我看到以下内容:

NUnit 1.2.0.0 开始发现测试

在D:\Code\ThisProject\src\MainWebApplication\bin\MainWebApplication.dll中发现测试时抛出了ArgumentNullException异常

在D:\Code\ThisProject\src\UnitTests\bin\Debug\UnitTests.dll中发现测试时抛出了ArgumentNullException异常

NUnit 1.2.0.0 发现测试完成

嗯...在这个提交中,我确实引入了一个新的方法,它会抛出参数为空的异常。我想知道如果我注释掉这些检查会发生什么?

NUnit 1.2.0.0 开始发现测试

在D:\Code\ThisProject\src\MainWebApplication\bin\MainWebApplication.dll中发现测试时抛出了ArgumentNullException异常

NUnit 1.2.0.0 发现测试完成

一个名称相同的测试'UnitTests.SomeNamespace.SomeTestClass.SomeTestMethod(someparameter)'已经存在。这个测试没有被添加到测试窗口。

等等,怎么回事?

在我的代码中删除了一个参数为空的检查,这个方法在一个库程序集中(即最初失败的两个程序集中的任何一个),使得测试发现的性能(稍微)有所改善。到底发生了什么?

但更奇怪的是:

在看到上述奇怪情况后,我恢复了R#(作为故障排除的一部分)并尝试再次运行测试。它们都运行并通过了。是的,我仔细检查并取消了对null检查的注释(除此之外没有改变任何内容),我又回到了初始状态-每个测试都是"Inconclusive: test wasn't run"。

这里到底发生了什么?


我不知道它如何相关,但关于具有null检查的特定方法有一些“特殊”的事情,所以我认为我不能在这样的问题中忽略它们(在我所知道的情况下,包括米老鼠在内的一切都可能是相关的...):

  1. 该方法经常使用服务定位调用填充其中一个参数(不好的做法,我知道,但这是一个庞大的项目,有遗留代码,而这些调用遍布其中;没有办法改变这个)。如果以这种方式进行调用并且IoC容器还没有设置,那么参数确实为空。
  2. 该方法调用HttpContext.GetGlobalResourceObject,并传递参数(这就是为什么我首先要进行空检查的原因...),我们通过web.config配置了自定义资源提供程序。我没有改变这个配置,只是将调用移到了一个不同的位置。
0
0 Comments

问题的原因是在一个被引用的项目中添加了一个空参数检查,导致所有的NUnit测试都被跳过了。

解决方法是对引发ArgumentNullException的静态方法进行重构,使其在构造属性时不会引发异常。

为了找到错误的代码,使用以下命令运行Visual Studio非常有用:

devenv.exe /ReSharper.LogLevel Verbose /ReSharper.LogFile c:\path\to\logfile.txt

然后编译项目并开始运行单元测试(所有的测试都报告"Inconclusive; test wasn't run"),然后退出Visual Studio。在日志文件的末尾,有一个堆栈跟踪告诉我异常的来源。

0