在 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")]

到特定的方法上


posted on 2012-03-15 19:20  听说读写  阅读(1748)  评论(1编辑  收藏  举报

导航