如何设计一个类来模拟未知类型?

时间:2010-09-02 20:32:24

标签: c# mocking factory

我见过这样的例子,其中一个接口被提供给工厂,它生成实现接口的对象。这对我来说并不复杂,但我没有得到的是如何使用它来实现行为。

以WCF中的ChannelFactory为例......当您从接口生成通道时,它会公开调用远程过程时的方法(来自接口)。我似乎在如何做到这一点上有一点差距。这可能是一种常见的设计模式,但我认为我再次使用SO作为研究扩展。

2 个答案:

答案 0 :(得分:1)

模拟接口的模拟框架会生成实现接口的动态类。模拟方法的行为将取决于框架。通常,除非通过模拟提供实现,否则该方法将不执行任何操作。

例如:

Mock<IRepository> repMock = new Mock<IRepository>();
repMock.Setup(r => r.FindById(1)).Returns(new MyObject());

假设IRepository接口定义了FindByID方法,模拟的Setup方法动态生成方法的实现并将其“注入”到mock中。这是使用Reflection.Emit完成的,它可用于动态构建IL指令并动态编译它们。

答案 1 :(得分:1)

通常通过代码发出来实现。请参阅System.Reflection.Emit中的类。

例如,你可以获得一个接口Type并查看它声明的方法,然后使用TypeBuilder构建你自己的继承它的类型,并在方法中实现你想要的任何功能(或者只是它们为空/做一个返回默认值(T),使用MethodBuilder等,直到您对接口满意为止。