在 Visual Studio 單元測試中使用CallContext 導致的 Unit Test Adapter threw exception: Type is not resolved for member... 異常
該問題的表現形式是:
在運行單元測試(或其他的VS測試類型)的時候 拋出異常 Unit Test Adapter threw exception: Type is not resolved for member...
但是同樣的測試在應用程序/網站中都沒有問題
該問題的根本原因是:
Visual Studio運行測試代碼的時候實際上是在一個獨立的AppDomain中運行的,該AppDomain 無法找到CallContext中存儲的類型
所以拋出了這個異常,不過這個異常信息非常不清晰,只看異常信息很難找到問題原因
目前為止有3個解決方案:
1.拷貝DLL到QAAgent32.exe所在的目錄 (一般在visual studio安裝目錄里面,一般是C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE)
該方案對DLL沒有特殊要求,就是麻煩了點
可以通過在Build Event中的 Post-build event command line 里面增加一個自動的copy命令 來簡化手動操作
同時由于QAAgent32.exe會一直保持運行,會導致文件被鎖定無法自動覆蓋,所以要設置Tools->Options->Test Tools->Test Excetion -> 取消 keep test exection engine running between test runs 的勾
2.修改QAAgent32.exe.config 中的AssemblyRedirect 重新綁定一個路徑
3.將程序集注冊到GAC (強烈推薦)
將程序集注冊到GAC的好處不僅僅是本地可以運行,當使用TFS Build來運行自動化測試的時候,在其他機器上也可以運行測試,而不需要再次配置
此外將程序集做成強名稱還有很多其他的好處,(大家可以自己google下~~~)
可以在Build成功以后自動將生成的程序集注冊到GAC
配置步驟如下:
1.添加GACUtil.exe到項目文件中 (有很多個版本的GACUtil.exe 高版本兼容低版本)
2.右擊GACUtil.exe -> 屬性 -> Copy To Output Directory 設置為Copy if newer (并且保持Build Action 為默認值 Content)
3.右擊項目屬性->Build Event ->Post-build event command line 添加如下代碼
"$(TargetDir)gacutil" -u "$(TargetName)"
"$(TargetDir)gacutil" -i "$(TargetPath)"
@echo add assembly to GAC $(TargetPath)
以上代碼的大意就是,先從GAC中移除同名的DLL,然后再注冊進去,然后打印一些信息出來
PS:好吧。。其實還有一個辦法是增加一個Attribute
[DeploymentItem("Arch.Base.Logging.API.dll")]
到特定的方法上
浙公網安備 33010602011771號