这是我的类的实现,其中generic实现了两个接口... ...
public class ClassA<TGeneric> : where TGeneric: IInterfaceA, IInterfaceB
我想对ClassA进行Mock。然而,我不能使用
var mock = new Mock<Class<A<IInterfaceA>>();
或
var mock = new Mock<Class<A<IInterfaceB>>();
因为通用型需要实现两个接口。我知道你可以通过使用moq上的As()方法来模拟具有多个接口的对象,但我这里并没有真正的对象,而是一个通用类型。
有什么想法?
谢谢...
你可以定义一个同时包含接口A和B的接口(在你的测试项目中,为了测试目的),然后在你的mock中使用它。
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(); }