我正在尝试使用对COM接口具有依赖性的对象进行TDD。我虽然在进行开发测试时嘲笑COM接口,但在集成测试中做到了。
但是,我无法模拟COM接口,我尝试使用Moq,它会引发异常:
System.TypeLoadException未处理 按用户代码 消息=无法加载类型'Castle.Proxies.iTunesAppProxy' 从程序集'DynamicProxyGenAssembly2, 版本= 0.0.0.0,文化=中立, 公钥=空”。类型是 标记为有资格获得类型 等价,但要么具有通用性 参数,或者它不是结构, COM导入界面,枚举, 或委托
是否可以使用其他框架? 你如何使用COM依赖对象进行TDD?
提前致谢!或委托
答案 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));