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

时间:2014-10-30 18:19:56

标签: c# unit-testing nunit resharper

我遇到了this problem,其中NUnit测试不是由Resharper的测试运行器执行的。在git bisect会话之后,我已经隔离了导致这种情况的提交,但我无法确定原因;我发现的大多数解决方案都引用了损坏的app.config文件,但我的提交只改变了C#代码。它只能用于我的一个测试项目 - 单元测试 - 而其他测试(集成和验收测试,也由NUnit驱动)运行正常。

所以,我尝试对其他方法进行问题排查,并且在this guy's troubleshooting之后,我为Visual Studio安装了NUnit Test Adapter,尝试使用VS而不是R#运行测试。

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

NUnit 1.2.0.0 discovering tests is started
Exception System.ArgumentNullException, Exception thrown discovering tests in D:\Code\ThisProject\src\MainWebApplication\bin\MainWebApplication.dll
Exception System.ArgumentNullException, Exception thrown discovering tests in D:\Code\ThisProject\src\UnitTests\bin\Debug\UnitTests.dll
NUnit 1.2.0.0 discovering test is finished

嗯......我确实在这个提交中引入了一个新方法,它抛出了参数null异常。我想知道如果我评论出这些支票会发生什么?

NUnit 1.2.0.0 discovering tests is started
Exception System.ArgumentNullException, Exception thrown discovering tests in D:\Code\ThisProject\src\MainWebApplication\bin\MainWebApplication.dll
NUnit 1.2.0.0 discovering test is finished
A test with the same name 'UnitTests.SomeNamespace.SomeTestClass.SomeTestMethod(someparameter)' already exists. This test is not added to the test window.

等等,什么?

删除我的代码中的参数null check ,它位于库程序集中(即在最初都失败的程序集中都没有,尽管它们都调用了这个方法) make test发现执行(稍微)更好。发生了什么事?

但它仍然更奇怪:

在看到上述奇怪之后,我恢复了R#(我已将其作为故障排除的一部分暂停)并尝试再次运行测试。 它们全部运行并通过。是的,我仔细检查并取消注释空检查(更改没有别的),然后我回到原点 - Inconclusive: test wasn't run ,对于装配中的每一次测试。

这里发生了什么?


我不知道它是如何相关的,但是对于使用null检查的特定方法有一些“特殊”的东西,所以我想我不能让它们脱离这样的问题(其中据我所知,包括米老鼠在内的一切都可能是相关的......):

  1. 通常使用服务位置调用填充的其中一个参数来调用该方法(不好的做法,我知道,但这是一个包含遗留代码的大项目,而且这些调用遍布全部;没有办法改变那个)。 如果进行了类似的调用并且尚未设置IoC容器,则参数确实为空。

  2. 该方法调用HttpContext.GetGlobalResourceObject,传递参数(这就是我首先要进行空检查的原因......),我们通过{配置了自定义资源提供程序{1}}。我没有改变任何这种配置,只是将呼叫转移到另一个地方。

1 个答案:

答案 0 :(得分:2)

在R#支持的帮助下,我设法压制了这个bug。

根本原因是我的静态方法,它抛出了ArgumentNullException,在一个案例中,在属性的构造函数中调用。当我重构该属性以便在构造期间不会引起异常时,问题就消失了。

如果没有确认,我想从参数构造函数抛出异常的问题是NUnit在测试发现期间实例化属性,并且不能正确处理异常。因此,一旦属性构造函数抛出任何内容,NUnit就会完全变为borks,这并不会让任何测试运行者有机会让用户知道问题所在。

要查找有问题的代码,使用以下命令运行VS非常有用:

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

然后我编译了我的项目并开始了单元测试运行(其中所有测试报告“不确定;测试未运行”)然后再次退出VS.在日志文件的末尾,有一个堆栈跟踪告诉我异常的来源。