【问题标题】:Mocking generics that implement multiple interfaces模拟实现多个接口的泛型
【发布时间】:2020-05-28 18:00:35
【问题描述】:

这是我的类实现,其中泛型实现了两个接口...

public class ClassA<TGeneric> : where TGeneric: IInterfaceA, IInterfaceB

我想模拟 ClassA。但是,我不能使用

var mock = new Mock<Class<A<IInterfaceA>>();

var mock = new Mock<Class<A<IInterfaceB>>();

因为泛型需要两个接口的实现。我知道您可以通过在 moq 上使用 As() 方法来模拟具有多个接口的对象,但我这里并没有真正的对象,而是泛型类型。

想法?

谢谢...

【问题讨论】:

    标签: c# mocking moq


    【解决方案1】:

    您可以定义一个包含接口 A 和 B 的接口(在您的测试项目中,用于测试目的),然后在您的模拟中使用它。

    public interface ICanTestAAndB : IInterfaceA, IInterfaceB {}
    
    var mock = new Mock<ClassA<ICanTestAAndB>>();
    

    【讨论】:

      【解决方案2】:

      作为已接受答案的替代方案,您可以通过将模拟对象强制转换为 dynamic 来实现所需的功能,并且在运行时它将按预期工作。

      void Main()
      {
          var mockA = new Mock<IIntA>();
          mockA.Setup(a => a.DoA()).Returns(3);
      
          var mockB = mockA.As<IIntB>();
          mockB.Setup(iib => iib.DoB()).Returns(7);
      
          dynamic d = mockB.Object;
      
          TakeBoth(d);
      }
      
      void TakeBoth<T>(T obj) where T : IIntA, IIntB
      {
      }
      
      public interface IIntA { int DoA(); }
      public interface IIntB { int DoB(); }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多