是否可以在VS 2010中的单元测试中使用逻辑调用上下文?

时间:2011-03-26 01:19:48

标签: visual-studio-2010 unit-testing mstest

是否可以使此测试不会抛出异常?似乎将任何非GACed类添加到逻辑调用上下文中会导致在测试的第2行中抛出异常。

  

测试   'TestProject1.UnitTest1.TestMethod1'   失败:测试方法   TestProject1.UnitTest1.TestMethod1   抛出异常:   System.Configuration.ConfigurationErrorsException:   加载a时出错   配置文件:类型不是   为会员解决   “TestProject1.Bar,TestProject1,   版本= 1.0.0.0,文化=中立,   公钥=空”。 --->   System.Runtime.Serialization.SerializationException:   成员未解析类型   “TestProject1.Bar,TestProject1,   版本= 1.0.0.0,文化=中立,   公钥=空”。

namespace TestProject1 {
    [ Serializable]
    public class Bar {

    }

    [TestClass]
    public class UnitTest1 {
        [TestMethod]
        public void TestMethod1() {
            CallContext.LogicalSetData("foo", new Bar());
            ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None );
        }
    }
}

为什么?!?!?

4 个答案:

答案 0 :(得分:25)

答案 1 :(得分:11)

通过让Bar实现MarshalByRefObject可以解决这个问题。这允许在AppDomain中引用类,其中运行测试运行器。

[ Serializable]
public class Bar : MarshalByRefObject {

}

答案 2 :(得分:9)

当使用逻辑CallContext存储对象时,实现适当的终结逻辑(IDisposable)来清理存储在CallContext中的对象(例如:CallContext.FreeNamedDataSlot)

希望这有帮助,

Juanjo

答案 3 :(得分:0)

对我有用的另一种解决方法可能是在将任何对象添加到逻辑调用上下文之前初始化配置系统。

就我而言,WCF和WebAPI服务是在测试环境中自托管的,可以对其行为进行高度控制(例如,替换IoC容器中的组件),但是在执行通过Active Directory进行身份验证时会出现此序列化异常。 借助反射工具(例如IL Spy),我可以识别AD正在尝试读取并触发跨域序列化问题的配置部分(system.directoryservices)。

在启动自托管服务之前放置以下代码即可解决问题:

System.Configuration.ConfigurationManager.GetSection("system.directoryservices");

您可以阅读更多的解释herehere