模拟2种不同类型的相同界面

pqu*_*est 5 c# unit-testing moq mocking

我有一个界面IMyInterface,我在使用moq进行单元测试时嘲笑.

Mock<IMyInterface> firstMockedObject = new Mock<IMyInterface>();
Mock<IMyInterface> secondMockedObject = new Mock<IMyInterface>();
Run Code Online (Sandbox Code Playgroud)

被测单元有一个寄存器方法,如下所示:

public void RegisterHandler(Type type, IHandler handler)

然后是一个句柄方法:

public void Handle(IMyInterface objectToHandle)

我试图测试的是,我可以为2种不同的实现设置2个处理程序,IMyInterface并且Handle方法正确地选择使用哪个:

UnitUnderTest.RegisterHAndler(firstMockedObject.Object.GetType(), handler1);
UnitUnderTest.RegisterHAndler(seconMockedObject.Object.GetType(), handler2);
Run Code Online (Sandbox Code Playgroud)

问题是两个模拟对象都属于同一类型.有没有办法迫使Moq生成与不同类型相同接口的2个模拟?

Jot*_*aBe 7

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

public interface IMockOne : IMyInterface { };
public interface IMockTwo : IMyInterface { };


var firstMockedObject = new Mock<IMockOne>();
var secondMockedObject = new Mock<IMockTwo>();
Run Code Online (Sandbox Code Playgroud)

这允许您不要实现用于模拟的整个类,而是moq用于创建动态模拟.