在 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")]
到特定的方法上