我的公司一直在使用MSTest和NUnit。我現在將我們轉換爲僅使用NUnit。代碼充滿了架構問題,所以我們可以忽略這些代碼,並研究如何使其實際工作。我想,主要問題是數據庫連接的設置直接從ConfigurationManager.AppSettings []中拉取。在這種情況下,它的「SettingsFile」路徑。這是我們的主配置文件的路徑。NUnit在帶有coderush或testdriven.net的visual studio中運行「沒有找到測試」
我之所以提起這個問題,是因爲當那個「SettingsFile」存在時,NUnit錯誤,如果我將它命名爲SettingsFile2,它不會報錯。我也在我的代碼中重命名它的引用,所以它仍然有效,它不會再出錯。
當NUnit拋出錯誤時,它返回沒有找到測試。
我認爲可能「SettingsFile」是一些保留的應用程序設置爲NUnit,儘管它聽起來很可笑,但我沒有發現任何涉及這樣的。
我也創建了一個完全空白的項目。添加了一個測試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
UPDATE:
添加到我們的核心項目的引用導致該問題。 核心項目是讀取SettingsFile屬性的項目。 請注意,在任何訪問SettingsFile之前,我都會先寫入IO文件,並且沒有記錄任何內容。 我在CORE項目中搜索了靜態類構造函數。沒有了。 我不知道爲什麼添加引用會破壞這個。
UPDATE:
單元測試亞軍中的CodeRush不會更新以顯示正確的測試。 我將配置設置更改爲「SettingsFile2」,以便測試運行正常,然後單元測試運行器正確更新。但是,只要我右鍵點擊一個測試,並說要去測試,它現在會顯示所有已經存在的測試,現在已經被刪除。
奇怪的另一件事: Coderush打印結果兩次,但只運行一次測試。
搜索測試... 總測試:2,過濾:1個
CanConfirmDatabaseMatchesMappings失敗: ... CanConfirmDatabaseMatchesMappings失敗: ...
你怎麼能夠重現它?我試圖在空白的解決方案中進行復制,但無法完成。 – BradLaney
我已經請Test Runner開發人員查看它,並且他們回覆說「找不到測試」問題已被複制。一旦問題的狀態發生變化,我們會回覆詳細信息。 –
這是關於此問題的一些其他信息。當CodeRush單元測試運行器運行測試時,它將Directory.CurrentDirectory值設置爲被檢測爲Path.GetDirectoryName(TestAssembly)的TestAssemblyPath。 NUnit SettingsService嘗試從ConfigurationManager.AppSettings [「SettingsFile」]獲取文件名稱設置。 因此,如果TestAssemblyPath包含.config文件(例如,因爲它是如下所示): <添加鍵= 「SettingsFile」 值= 「[SettingsFileDirectory] \ Settings.settings」/> 的appSettings> –