2011-08-30 100 views
1

在我的程序中,我使用SevenZipSharp生成zip文件。 SevenZipSharp是一個託管DLL,它加載另一個DLL,7z.dll。我使用SevenZipCompressor.SetLibraryPath手動設置SevenZipSharp的路徑爲7z.dll。在執行MS-Test測試時無法加載DLL

當我在調試模式下執行我的程序時,這一切都正常工作,它會生成你喜歡的zip文件。然而,當我執行我的單元測試MSTEST,SevenZipSharp總是給我下面的錯誤:

「試驗方法拋出異常:SevenZip.SevenZipLibraryException:無法加載7-ZIP庫或內部COM錯誤消息:加載失敗圖書館..「

我懷疑MSTest可能會阻止SevenZipSharp能夠加載7z.dll,就像在安全性較高的沙箱中運行一樣(或者我是新來的C#和MSTest。 ..)

有沒有人有關於可能發生什麼的想法?

謝謝!

+1

什麼,你是否也在設定路徑?如果它是相對的,請將其更改爲完全限定的路徑名​​稱。 – NotMe

回答

2

考慮使用優秀的SysInternals tools中的Process Monitor (aka procmon.exe)來監控您的測試設備(MSTest)。它會告訴你可執行文件在哪裏查找7z.dll。

0

您確定要單元測試涉及外部庫嗎?理想情況下,您應該有機制來替換外部內容模擬對象,因爲測試這樣的外部庫實際上會將測試轉變爲集成測試。

對於流行的庫如SevenZipSharp,您可以假設它已經過正確測試,並且您可以進行手動集成測試以驗證它在程序中的正確執行。

我會考慮通過依賴注入,嘲諷框架等來擺脫這種依賴關係,並讓你的單元測試單獨測試你自己的代碼。

調查工廠方法或抽象工廠設計模式,瞭解如何輕鬆替換這些依賴關係的提示。

一個好的開始是創建自己的ICustomZipInterface,並使用包裝模式來封裝生產代碼的zip邏輯。在你的單元測試中,用一個虛擬實現替換該包裝類。例如,虛擬實現可能會記錄您如何訪問您的zip組件,並且您可以使用該信息來驗證您的代碼,而不是檢查是否實際創建了一個zip文件。

2

雖然這個問題提出了一個值得懷疑的方案,但是MSTest不加載所需的DLL的一般問題似乎是一個常見問題,值得一個不屑一顧的答案。

  1. 默認MSTest的會複製它認爲通過測試容器必須默認的結果文件夾的輸出文件夾,從而改變每次運行的組件。

  2. MSTest並不總是自動正確推斷必要的組件;如果沒有明確的直接引用程序集,它將不會被複制。此外,通常不會檢測本機DLL。

  3. 我不知道一個直接選項設置MSTest的搜索路徑。您可以使用procmon確定搜索路徑。如上所示(這基本上是標準的Windows DLL搜索)。

  4. 不直觀的是,默認搜索路徑不包括啓動目錄,我認爲這是造成混淆的原因。當測試運行時,當前目錄是測試結果「Out」目錄,而不是MSTest啓動目錄。

然而,可能有測試設置文件控制MSTest的搜索行爲(和複製行爲)。您可以通過Visual Studio輕鬆創建和編輯這些文件(請參閱測試菜單),然後在MSTest命令行上指定創建的設置文件。您可以爲Visual Studio和MSTest使用不同的設置文件。

通過這種方式,您可以準確控制將哪些DLL複製到您的測試目錄。 請參閱Create Test Settings to Run Automated Tests from Visual Studio以獲取更多信息。

當然,DLL加載失敗可能是由於缺少依賴關係,並且錯誤消息中提到的DLL可能存在本身。您可以使用依賴查看器或procmon來獲取DLL中的意外依賴關係。

0

的Visual Studio 2017年(也可能是2015年)提供了兩種新的方式來表明本機DLL或其他文件是由您的測試要求,而不需要一個測試設置文件:

1:將鏈接添加到DLL到您的測試項目,並告訴VS將其複製到輸出目錄。在Solution Explorer中右鍵單擊該項目,然後選擇Add> Existing Item。瀏覽到7z.dll,單擊添加按鈕旁邊的向下箭頭,然後選擇添加爲鏈接。然後在解決方案資源管理器中選擇新的7z.dll項目,alt-Enter調出屬性,並將「Copy to Output Directory」設置爲「Copy if newer」(或「Copy always」)。

2:將DeploymentItemAttribute附加到您的測試類。此屬性的構造函數接受一個字符串參數,該參數是要在類中提供給測試的文件的路徑。它與測試項目的輸出目錄相關。