【问题标题】:Mock same interface as 2 different types模拟 2 种不同类型的相同界面
【发布时间】:2015-11-24 15:57:09
【问题描述】:

我有一个接口 IMyInterface,我正在使用 moq 在单元测试中模拟它。

Mock<IMyInterface> firstMockedObject = new Mock<IMyInterface>();
Mock<IMyInterface> secondMockedObject = new Mock<IMyInterface>();

被测单元有一个如下所示的注册方法:

public void RegisterHandler(Type type, IHandler handler)

然后是句柄方法:

public void Handle(IMyInterface objectToHandle)

我要测试的是,我可以为IMyInterface 的 2 个不同实现注册 2 个处理程序,并且 Handle 方法正确选择要使用的处理程序:

UnitUnderTest.RegisterHAndler(firstMockedObject.Object.GetType(), handler1);
UnitUnderTest.RegisterHAndler(seconMockedObject.Object.GetType(), handler2);

问题是两个模拟对象属于同一类型。有没有办法强制 Moq 生成 2 个具有相同接口的模拟作为不同类型?

【问题讨论】:

    标签: c# unit-testing mocking moq


    【解决方案1】:

    创建两个从您的接口派生的接口。将它们用于模拟。每一个的类型都是模拟接口类型:

    public interface IMockOne : IMyInterface { };
    public interface IMockTwo : IMyInterface { };
    
    
    var firstMockedObject = new Mock<IMockOne>();
    var secondMockedObject = new Mock<IMockTwo>();
    

    这使您无需实现整个类进行模拟,而是使用moq 创建动态模拟。

    【讨论】:

    • 当你指出这一点时,它似乎很明显!这正是我所需要的。谢谢!
    【解决方案2】:

    您可以为此测试创建自己的模拟实现。 喜欢

    public class MockOne : IMyInterface {}
    public class MockTwo : IMyInterface {}
    

    【讨论】:

    • 请注意,如果您使用 Moq 模拟具体类,则成员必须是虚拟的。
    • @stuartd 我建议不要使用起订量并创建自己的模拟类。如有必要,您还可以跟踪通话。
    • @Valentin 这完全违背了动态模拟框架的使用,该框架包括从其他接口动态创建模拟。如果你这样做,你必须自己实现两个类中的整个接口。如果你这样做了,你就不是在使用 Moq,而是手动编写代码。
    猜你喜欢
    • 2010-11-06
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2010-11-14
    • 2023-03-11
    • 2015-02-05
    相关资源
    最近更新 更多