【问题标题】:Best interface mock / fake with partial implementation部分实现的最佳接口模拟/伪造
【发布时间】:2017-09-27 12:05:00
【问题描述】:

在 C# 下是否有一个很好的工具,可以通过部分测试实现来伪造复杂的接口(服务、存储库等)?

我目前使用的模拟框架 (RhinoMocks) 太慢且难以处理。

先决条件:

  • 与实际实现(批量测试)相比,没有显着的性能损失
  • 使用基本逻辑和数据实现(例如:字典而不是数据库表)
  • 当界面改变时,无需改变测试。

完整实现示例:

public interface IMyInterface
{
    int PropertyA { get; set; }
    int PropertyB { get; set; }
    void DoSomethingWithX(int x);
    int GetValueOfY();
}

public class FakeImplementation : IMyInterface
{
    private int _valueOfYCalls = 0;

    public int PropertyA { get; set; }
    public int PropertyB { get; set; }
    public void DoSomethingWithX(int x)
    { }

    public int GetValueOfY()
    {
        return _valueOfYCalls++;
    }
}

计数器只是为了模拟初级逻辑。

问题是,如果接口获得了一个新方法,例如 SetSomeZ(int z),测试将不再构建/运行,无需显式更改。

是否有假/模拟框架,使用基本实现,但通过虚拟/覆盖或包装器自动添加成员?

比如这样:

[ImplementsInterface(nameof(IMyInterface))]
public class FakeImplementationBase
{
    private int _valueOfYCalls = 0;

    [ImplementsMember(nameof(IMyInterface.GetValueOfY))]
    public virtual int GetValueOfY()
    {
        return _valueOfYCalls++;
    }
}

工具/框架应​​该在运行时生成完整的实现类型,类似于模拟/存根,但使用基本实现,只是添加缺少的接口部分。

这不应该用于真正的单元测试,而是用于更复杂的目的。它也是具有大量接口和类的遗留软件,与“单一职责”无关。

【问题讨论】:

    标签: c# mocking integration-testing partial


    【解决方案1】:

    起订量正是您想要的。

    public interface IFoo {
        int MethodA(int a);
        void MethodB(long b);
        void MethodC(string c);
        ...
    }
    
    var MoqFoo = new Mock<IFoo>();
    MoqFoo.Setup(m => m.MethodA(It.Is(a => a > 0)).Returns<int>(a => a + 1);
    MoqFoo.Setup(m => m.MethodC(It.IsAny<string>()).Callback<string>(c => Debug.Write(c));
    

    注意我们没有为 MethodB 做 .Setup() 吗?当您声明它时,所有方法和属性都会获得虚拟方法/属性,.Setup() 将指定您自己的自定义方法/属性。

    所以如果你的接口有 10 个方法,但你只想测试 MethodD(),你只需要为此编写代码。

    http://www.developerhandbook.com/unit-testing/writing-unit-tests-with-nunit-and-moq/

    【讨论】:

    • 谢谢,Moq 的性能如何? RhinoMocks 有类似的语法,但比真正的类慢得多(只要它们只在内存中)。我想避免在 RhinoMocks 中使用 .Setup(...).Stub() 相当复杂的语法。我希望框架在运行时创建一个新类型,它像常规类一样被实例化,只进行一次反射,然后具有像编码类一样的性能。
    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多