VS2017 無法載入文件或程序集 Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll 或其依賴項之一
當試圖打開一個舊的解決方案時,
VS2017有一個舊的單元測試項目在建構時給我帶來了問題。建構此測試項目時,我不斷收到以下錯誤:
無法載入文件或程序集 ‘file:///C:\Projects\MyProj\Test\DAL\UnitTestProj\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll’ 或其依賴項之一。該系統找不到指定的文件。
我檢查了項目的引用,它似乎正在引用
Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll. 此外,沒有程式碼錯誤。我怎麼知道它是否是它找不到的依賴項之一?
我在最初使用 VS2010 開發的項目中遇到了類似的問題(帶有附加消息
The "BuildShadowTask" task failed unexpectedly),並且不得不花費最後幾個小時來了解建構過程的另一個遺留方面。您很有可能正在處理私有訪問器文件(
.accessor),這些文件在 VS2012(原始原始碼)中已被棄用。這在 VS2010 團隊宣布他們不再致力於這些功能的公告中得到了預示。您也有可能只是在處理對錯誤版本的 UnitTestFramework 的錯誤引用,但 NuGet 還原應該可以解決此問題。如果沒有,請參閱此 GitHub 執行緒以獲得可能的修復(手動將 ref 更改為公共文件夾),或移至新的 MSTest.TestAdapter 和 MSTest.TestFramework 包(請參閱MSDN 支持執行緒)。
解決方案
A. 編輯單元測試
.csproj並將項目Include引用從Shadow=>None:<Shadow Include="Test References\namespace.accessor" />更改為
<None Include="Test References\namespace.accessor" />
.accessorB. 更好的是,只需從單元測試項目的文件夾中刪除所有Test References文件。理想情況下,您還可以重寫單元測試以刪除對私有方法的引用,方法是重新架構以分離關注點,或者將屬性更改為
internal並將“朋友”與InternalsVisibleToAttribute.對於那些出於某種原因需要繼續支持私有方法測試的人,同一篇文章對邏輯問題提供了以下建議
"What is available for me then?":對於那些希望繼續測試內部 API 的人,您有以下三種選擇:
- 使用 Microsoft.VisualStudio.TestTools.UnitTesting.PrivateObject 類來幫助訪問程式碼中的內部和私有 API。這可以在 Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll 程序集中找到。
- 創建一個反射框架,該框架能夠反射您的程式碼以訪問內部或私有 API。
- 如果您嘗試訪問的程式碼是內部程式碼,您可以使用 InternalsVisibleToAttribute 訪問您的 API,以便您的測試程式碼可以訪問內部 API。
但是,對於語言團隊添加的新功能,程式碼生成沒有任何好的替代品。您可以創建 TestMethod 存根,然後刪除內部程式碼。您只需要保留存根本身。
進一步閱讀/幫助我將其拼湊在一起的資源:
- VS 2005 ASP.NET訪問器的解釋
- 2008 年的部落格文章解釋瞭如何為建構伺服器解決此問題
- MSDN 論壇執行緒,討論訪問器的目的、實現和解決方法。從大約 1/3 開始。
- MSDN BaseShadow 文件
- MSDN PrivateObject 類