模拟实现多个接口的泛型

本文关键字:泛型 接口 实现 模拟 | 更新日期: 2023-09-27 18:10:25

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

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()方法模拟具有多个接口的对象,但我这里实际上没有对象,而是泛型类型。

想法吗?

谢谢…

模拟实现多个接口的泛型

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

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

作为可接受的答案的替代方案,您可以通过将模拟对象强制转换为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(); }