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

    到特定的方法上


  • 相关阅读:
    Sql日期时间格式转换;取年 月 日,函数:DateName()、DATEPART()
    @@ROWCOUNT (Transact-SQL)
    C#调用存储过程简单完整例子
    C# Ajax 手机发送短信验证码 校验验证码 菜鸟级别实现方法
    C#反射技术的简单操作(读取和设置类的属性)
    .NET调用Java写的WebService
    蓝牙错误提示
    sql开启xp_cmdshell
    网页手机宽度
    对称加密算法比较
  • 原文地址:https://www.cnblogs.com/PurpleTide/p/2398519.html
Copyright © 2020-2023  润新知