我的公司一直在使用 MSTest 和 NUnit。我现在将我们切换为仅使用 NUnit。代码充满了架构问题,所以我们可以忽略这些并研究如何让它真正工作。我猜,主要问题是数据库连接的设置是直接从 ConfigurationManager.AppSettings[] 中提取的。在这种情况下,它的“SettingsFile”路径。它是我们主配置文件的路径。
我提出这个问题的原因是,当“SettingsFile”存在时,NUnit 会出错,如果我将其命名为 SettingsFile2,它不会出错。我还在我的代码中重命名了对它的引用,所以它仍然有效,只是不再出错。
当 NUnit 抛出错误时,它返回未找到任何测试。
我想也许“SettingsFile”是为 NUnit 保留的一些 appSetting,听起来很荒谬,但我没有发现任何关于此类的东西。
我还创建了一个完全空白的项目。添加了一个测试 C# 测试模板项目,添加了一个 nunit 测试,添加了一个 app.config,对其进行了测试并且它工作正常。我什至有相同的 app.config 设置。
重申一下:如果我进入测试项目的 app.config 并将 key="SettingsFile" 更改为 key="SettingsFile2" 然后将我的配置类更改为 ConfigurationManager.AppSettings["SettingsFile2"] 并且没有其他任何更改,它现在将正确构建。为什么会这样?
我知道解决方案是不在 appSettings 中使用“SettingsFile”一词……但它已经在我们所有的生产服务器、测试服务器、登台服务器、开发服务器等中使用。我们没有简单的方法来更新它们,但如果我们也有,我只需要向经理们争论我的观点。
DXCore 测试的输出:
Testing started:
Exception:
Message: Exception has been thrown by the target of an invocation.
Source: mscorlib
StackTrace:
at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
at CR_ExtUnitTestRunner.Invoker.InvokeInThread()
InnerException:
Exception:
Message: Error loading settings file
Source: nunit.util
StackTrace:
at NUnit.Util.XmlSettingsStorage.LoadSettings()
at NUnit.Util.SettingsService..ctor(Boolean writeable)
at NUnit.Util.SettingsService..ctor()
at CR_NUnitTesting.Executor.Initialize()
at CR_NUnitTesting.Executor.Execute(ExecuteTestData data)
at CR_NUnitTesting.NUnitExtension.Execute(Int32 major, Int32 minor, ExecuteTestData data)
at CR_NUnitTesting.NUnitExtension.<InitializePlugIn>b__2(ExecuteTestData data)
InnerException:
Exception:
Message: Object reference not set to an instance of an object.
Source: nunit.util
StackTrace:
at NUnit.Util.XmlSettingsStorage.LoadSettings()
No tests found.
Duration : 5.25776431101399
更新:
添加对我们的 CORE 项目的引用会导致问题。核心项目是读取 SettingsFile 属性的项目。请注意,我在任何访问 SettingsFile 之前放置了 IO 文件写入,并且没有记录任何内容。我在 CORE 项目中搜索了静态类构造函数。没有了。我不知道为什么添加参考会破坏这一点。
更新:
coderush 中的单元测试运行程序不会更新以显示正确的测试。我将配置设置更改为“SettingsFile2”,以便测试运行良好,然后单元测试运行程序正确更新。但是当我右键单击一个测试并说去测试时,它现在会显示所有曾经存在的测试,这些测试现在都被删除了。
另一件奇怪的事情:Coderush 打印了两次结果,但只运行了一次测试。
正在搜索测试... 总测试:2,过滤:1
CanConfirmDatabaseMatchesMappings 失败:... CanConfirmDatabaseMatchesMappings 失败:...