嘲笑实现多个接口的属种

问题描述 投票:4回答:2

这是我的类的实现,其中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()方法来模拟具有多个接口的对象,但我这里并没有真正的对象,而是一个通用类型。

有什么想法?

谢谢...

c# mocking moq
2个回答
8
投票

你可以定义一个同时包含接口A和B的接口(在你的测试项目中,为了测试目的),然后在你的mock中使用它。

public interface ICanTestAAndB : IInterfaceA, IInterfaceB {}

var mock = new Mock<ClassA<ICanTestAAndB>>();

0
投票

作为公认的答案的替代方案,你可以通过将被模拟的对象转换为 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(); }
© www.soinside.com 2019 - 2024. All rights reserved.