使用Rhino Mocks模拟COM接口

5
我有一个COM库需要在我的应用程序中引用,我正在尝试模拟其接口。
当我执行以下代码时MockRepository.GenerateMock<IAmAComInterface>();,我会收到异常。
但是,当我执行以下代码时MockRepository.GenerateDynamicMockWithRemoting<IAmAComInterface>();,不会出现任何异常,但是我的所有期望都没有被验证。
我做错了什么吗?
目前为止,我已经为我的所有COM接口创建了一堆包装器并进行了模拟,但我真的不想包装所有内容。
编辑: 使用GenerateMock时会出现异常:System.TypeLoadException。 消息如下: The type is marked as eligible for type equivalence, but either it has generic parameters, or it is not a structure, COM imported interface, enumeration, or delegate. 当使用GenerateDynamicMockWithRemoting时,对于任何针对COM接口的期望,测试失败总是说Expected: 1 Actual: 0。
使用Rhino.Mocks 3.6。

@Wim Coenen 编辑后包括异常和更多细节。 - Adam
这些COM接口是在.NET中创建并设计用于导出到COM的吗?还是它们是带有通过tlbimp生成的.NET类型库的COM对象? - PatrickSteele
@Patrick Steele 它们是使用tlbimp(如果版本有任何区别,则为VS 2010)生成的.NET类型库的COM对象。 - Adam
2个回答

13

看起来这是 .NET 4.0 的 "类型等效性" 问题。有关详细信息,请参见:http://code.google.com/p/moq/issues/detail?id=254

解决方法(如上所述)很简单,只需添加:

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

针对您的单元测试。


我无法调用此函数,因为出现了类似的错误:Castle.DynamicProxy.Generators.AttributesToAvoidReplicating存在于'...Castle.Core.dll'和'...Rhino.Mocks.dll'两个程序库中。 - PandaWood
@PandaWood - 请参考:https://dev59.com/WF3Ua4cB1Zd3GeqP9iPo - PatrickSteele
这太棒了!我之前在托管 WCF 服务时遇到了问题,类似于这里所解释的 https://groups.google.com/forum/#!msg/rhinomocks/8PT3mLYWxVo/ZXVnBDjt-dkJ但是使用你的示例后,一切都很顺利。 - scorpio
在进行彻底测试时,我遇到了一个问题,即如果您在语句之前为类/接口生成了模拟以避免属性,则后续对同一类/接口的模拟生成不会尊重这些语句,并返回带有属性的模拟对象。因此,请确保“避免语句”是在任何模拟生成之前执行的第一个语句。 - scorpio

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接