如何在C#中测试COM依赖对象

时间:2010-07-11 17:29:12

标签: c# tdd moq

我正在尝试使用对COM接口具有依赖性的对象进行TDD。我虽然在进行开发测试时嘲笑COM接口,但在集成测试中做到了。

但是,我无法模拟COM接口,我尝试使用Moq,它会引发异常:

  

System.TypeLoadException未处理   按用户代码   消息=无法加载类型'Castle.Proxies.iTunesAppProxy'   从程序集'DynamicProxyGenAssembly2,   版本= 0.0.0.0,文化=中立,   公钥=空”。类型是   标记为有资格获得类型   等价,但要么具有通用性   参数,或者它不是结构,   COM导入界面,枚举,   或委托

是否可以使用其他框架? 你如何使用COM依赖对象进行TDD?

提前致谢!或委托

4 个答案:

答案 0 :(得分:5)

尝试将包含COM接口的程序集的“嵌入互操作类型”设置为FALSE。

答案 1 :(得分:2)

我建议你取得COM对象接口的所有权,这就是依赖性倒置原则的用武之地。

如果您无权访问源代码,则必须创建自己的包装COM对象的抽象,否则您将在整个代码中进行第三方调用。

<强> [编辑]

现在抽象应该能够被嘲笑。包装器的实际实现将COM对象作为HAS-A关系。

然后,您将需要进行实施的集成测试。

您需要将COM对象本身视为与数据库或图形渲染引擎或Web服务类似的东西。

答案 2 :(得分:1)

好吧,我认为没有直接的方法可以做到这一点,不确定一些模拟框架是否可以模拟COM。

我的想法......

你有一些COM接口,ISomeThing和COM对象实现了这个接口CoSomeThing,这是一些真正的实现。你应该实现另一个COM组件,它将实现相同的接口,但实际上只是模拟它 - CoSomeThingMock。

在您的代码中,您实例化CoSomeThingMock,而不是CoSomeThing并使用它。

var component = new CoSomeThingMock();
var testObject = new Tested(component);

答案 3 :(得分:1)

您需要在初始化部分添加以下内容,如此处https://code.google.com/p/moq/issues/detail?id=254

所述
Castle.DynamicProxy.Generators.AttributesToAvoidReplicating.Add(typeof (TypeIdentifierAttribute));