47

當我使用Visual Studio運行單元測試時,它工作正常,因爲它從所有程序集所在的項目目錄運行。 但是,當我與ReSharper的運行它,它用錯誤的推移Resharper從不同位置運行UnitTest

var services = Assembly.Load("SomeAssembly"); 

錯誤

無法加載文件或程序集「SomeAssembly」或它 的一個依賴。該系統找不到指定的文件..

所以我已經試過

var path = Assembly.GetExecutingAssembly().Location; 

,它不是一個項目。這是

C:\用戶\ *用戶名* \應用程序數據\本地的\ Temp \ TestResults \ ... \輸出\

並沒有'SomeAssembly'。如何正確配置resharper或收集像Visual Studio一樣的所有程序集?

它發生在單元測試,但沒有與NUnit,任何想法?

回答

41

默認情況下,Resharper Shadow會複製用於測試的程序集。如果關閉陰影複製,它將運行在bin文件夾中,並且測試應該通過。 Here是關閉它的一些說明。

+0

正好與單元測試,但不能與NUnit的,所以有什麼不同,任何想法? @tallseth – Roar 2013-04-30 06:24:28

+0

當你說「單元測試,但不與nunit」時,你是什麼意思?你的意思是MSTest?或者你的意思是它可以與nunit控制檯運行程序一起使用,但不是使用resharper插件,並且所有測試都使用nunit框架? – tallseth 2013-05-01 04:14:14

+0

是的,當我運行MSTest與resharper它失敗,但是當我運行與TestExplorer的MSTest運行正常,當我運行NUnit與resharper它運行良好t00 – Roar 2013-05-01 06:55:55

2

您正在使用Assembly.Load()動態加載您的裝配。可能是你缺少一個加載程序集的引用。否則,陰影複製可能會漏掉未引用的程序集。

如果您不想引用這些程序集,請確保將它們包含在您的項目中並將它們複製到輸出目錄中。您可以通過將「複製到輸出目錄」屬性或創建自定義構建後步驟來執行此操作。

+0

我參考需要的程序集,它工作正常,如果NUnit測試,但不適用於默認Visual Studio測試Microsoft.VisualStudio.TestTools.UnitTesting; – Roar 2013-04-30 09:29:14

+0

目前還不知道。順便說一句:Microsoft.VisualStudio.TestTools.UnitTesting功能通常被稱爲「MSTest」。也許這有助於獲得更好的搜索結果。 – 2013-04-30 10:44:23

12

我有同樣的問題,resharper測試運行器是在C:\而實際的內置dll和解決方案是在另一個驅動器上。解決方案是在resharper選項的MSTest設置頁面中取消選中「Use Legacy Runner」。

+2

謝謝你,你救了我很多痛苦! – 2013-12-16 05:51:39

25

documentation爲NUnit的GUI的測試運行器設置有大約影複製

注意以下注意事項:如果你被誘惑,以獲得在同一目錄文件作爲組件禁用卷影副本,你應該知道有其他選擇。考慮使用Assembly.Codebase屬性而不是Assembly.Location。

以下是使用Assembly的示例。Codebase屬性

private string AssemblyLocation() 
    { 
     var assembly = Assembly.GetExecutingAssembly(); 
     var codebase = new Uri(assembly.CodeBase); 
     var path = codebase.LocalPath; 
     return path; 
    } 
+9

來到[TestContext.CurrentContext.TestDirectory](https://github.com/nunit/docs/wiki/TestContext#testdirectory)。我現在在NUnit 3.0中使用它。我不知道TestContext.CurrentContext.TestDirectory可用的時間有多遠。 – mcdon 2016-07-05 18:47:58

+0

您應該添加TestContext解決方案作爲不同的答案,因爲它本身就是一個很好的答案。我會爲此投票。 這也在NUnit 2.6中工作,我認爲一般來說2.x版本。 – Holf 2016-12-09 10:44:51

3

試試這個代碼的加載(見下文)。它將查找獨立於測試運行程序的程序集。

private static string[] assemblyLookupPath = new[] 
{ 
    AppDomain.CurrentDomain.BaseDirectory, 
    Environment.CurrentDirectory, 
    Assembly.GetExecutingAssembly().Location 
}.Distinct().ToArray(); 

public static void Assembly Load(string fileName) 
{ 
    var filePath = assemblyLookupPath 
     .Select(f=>Path.Combine(f, fileName)) 
     .Where(File.Exists) 
     .FirstOrDefault(); 

    /*do here null checks and raise errors, write logs, etc*/ 

    return Assembly.LoadFrom(filePath) 
} 
1

剛剛從mcdon完成非常有幫助的答案,使用assembly.Location給出了正確的答案,因爲每個MSFT的解釋:

基本代碼是一個URL到源文件所在的地方發現,而 位置是實際加載的路徑。例如,如果程序集是從互聯網上下載的,則其代碼庫 可能以 開頭爲「http://」,但其位置可能以「C:\」開頭。如果 文件被陰影複製,則該位置將作爲影子副本目錄中文件 副本的路徑。

很高興知道CodeBase不能保證在GAC中爲組件設置 。然而,從磁盤加載的組件 的位置將始終設置。

所以我會用以下內容:

public static DirectoryInfo GetAssemblyDirectory() 
{ 
    var assembly = Assembly.GetExecutingAssembly();  
    return new DirectoryInfo(Path.GetDirectoryName(assembly.Location)); 
} 
0

什麼解決了這個問題對我來說是設置了「複製本地」屬性設置爲true在測試項目中的nunit.framework.dll中參考。

0

如果已經運行和「影子構建」 的停用後,建立問題,必須首先選擇從構建選項「清理所有」,之後建立在你的項目的「影子打造」禁用