【问题标题】:How can a class be designed to mock an unknown type?如何设计一个类来模拟未知类型?
【发布时间】:2010-09-02 20:32:23
【问题描述】:

我见过这样的示例,其中向工厂提供接口并生成实现该接口的对象。这对我来说并不复杂,但我不明白如何使用它来实现行为。

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

【问题讨论】:

    标签: c# mocking factory


    【解决方案1】:

    通常通过代码发射发生。请参阅 System.Reflection.Emit 中的类。

    例如,您可以获取一个接口类型并检查它声明的方法,然后使用 TypeBuilder 构建您自己的继承它的类型,并在方法中实现您想要的任何功能(或者只是让它们为空/执行return default(T)),使用 MethodBuilder 等等,直到你对接口感到满意。

    【讨论】:

      【解决方案2】:

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

      例如:

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

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

      【讨论】:

      • repMock 不会只是 IRepository 类型吗?强类型为Mock&lt;IRepository&gt; 的对象不会被视为IRepository 本身。除此之外,是的,框架通常会使用反射来动态生成实现所需接口的 MockBase 类的一些变体,并且接口公开的方法是使用对控制预期行为的集中式 MockBase 成员的回调来实现的。
      • @Keith:repMock 是 Moq.Mock 类型。 repMock.Object 是实现 IRepository 的动态生成的类。安装程序将接口定义的任何方法的实现注入到类中。
      • 好吧,我已经习惯了 RhinoMocks,在那里你使用静态 GenerateMock 方法来生成一个看起来像 IRepository 的类。起订量显然有点不同。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多