【问题标题】:How to write Internal mockable method如何编写内部可模拟方法
【发布时间】:2010-06-24 20:57:26
【问题描述】:

我们使用 Moq 作为我们的模拟框架,问题是需要可模拟的类型是使用接口完成的,问题是该接口中的任何内容都是公共的,因此被视为我们公共 API 的一部分。

有没有办法让成员可以模拟而不是公开的?

【问题讨论】:

    标签: .net interface mocking moq


    【解决方案1】:

    如果我对您的理解正确,您希望能够将接口应用于类型以支持模拟,但这样做的方式是接口对您的代码的公共使用者不可见。

    嗯,一种选择是您可以实现一个internal 接口并使用[assembly:InternalsVisibleToAttribute] 使您的单元测试可以访问内部类型。

    [assembly:InternalsVisibleTo("MyUnitTestAssembly")]
    
    internal interface ISomeInterfaceForMocking { ... }
    
    public class MyMockableType : ISomeInterfaceForMocking { ... }
    

    【讨论】:

    • 可行,但在这种情况下,所有成员都是内部成员,有没有办法对其进行更多控制?
    • @Keivan - 更多控制权到底是什么意思?您唯一的其他选择是使成员 internal protected 允许派生类也可以访问它们。
    【解决方案2】:

    http://code.google.com/p/moq/wiki/QuickStart#miscellaneous(参见杂项部分)是否有任何用途(即,用于模拟 protected 东西的语法)?

    ISP 说接口上不应该有只有某些人感兴趣的神奇东西。另外,您是否考虑过坚持使用单个 virtual 方法而不是整个接口和/或可模拟位的基本接口?或者只是有一个特定的接口。请记住,如果很难模拟或测试,通常可以在您的代码中改进一些东西(而不是寻找跳圈的技术技巧和/或使用过于强大的模拟框架)。

    另外,我敢打赌,如果您发布一个精简版的测试,有人将能够恰到好处地重构它,我们都会学到一些东西。

    【讨论】:

      猜你喜欢
      • 2015-12-18
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      相关资源
      最近更新 更多