該問題的表現形式是:
在運行單元測試(或其他的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")]
到特定的方法上