最小起订量 – 如何模拟一个接口需要被转换到另一个接口?

我想要做的是构build一个moq为I1 – 这是很好的…但是在方法的过程中,我正在testing使用这个模拟我需要把它投到I2为了访问一些属性不是I1

Interface I1 { int AProperty{get;set;}} Interface I2 {int AnotherProperty{get;set;}} 

然后我有一些物体

 Class O1 : I1 {} 

 Class O2 : O1 , I2 {} 

问题是当我有一个I2实现对象的实例时,我可以将它转换为I1,以便访问通过该接口实现的方法。 在代码中,这不是一个问题,everythign按预期工作。

在这个类上写unit testing时唯一的问题就出现了。

接口还公开了一个名为GetNewInstance的方法,该方法将实现对象的初始化实例返回到IGetNewInstance接口中…我通常可以嘲笑它并使其自身返回(所以我继续使用模拟对象)。

然而,当你试图把这个I2types的返回对象强制转换为I1时,会产生一个空引用结果 – 这是有道理的,因为实现I2的模拟对象并不inheritance任何inheritanceI1的对象。

问题是我怎样才能强制模拟对象同时从I1 I2 I2同时inheritance?

我理解你的方式,你想创build一个实现两个接口的模拟。 用Moq,就这么简单:

 var mock = new Mock<IFoo>(); // Creates a mock from IFoo mock.As<IBar>(); // Adds IBar to the mock mock.As<IBar>().Setup(m => m.BarMethod()).Returns(new object()); // For setups. 

现在,您可以设置期望并使用您的模拟,就像您通常使用实现IFooIBar的对象IBar

对于你的GetNewInstance方法,你可以设置一个返回模拟本身的期望值。