MOQ-如何模拟需要转换为另一个接口的接口?


76

我想做的是为I1构造一个最小起订量-很好...但是,在我测试的使用此模拟程序的方法的过程中,我需要将其强制转换为I2才能访问某些未启用的属性I1

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

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

然后我有一些东西

Class O1 : I1 {}

Class O2 : O1 , I2 {}

问题是,当我拥有I2实现对象的实例时,可以将其强制转换为I1以便访问通过该接口实现的方法。在代码中这不是问题,一切都能按预期进行。

唯一的问题是在该类上编写单元测试时。

这些接口还公开了一个名为GetNewInstance的方法,该方法返回转换为IGetNewInstance接口的实现对象的初始化实例……我通常可以对此进行模拟并使其自身返回(因此我继续使用模拟对象)。

但是,当您尝试将此类型为I2的返回对象转换为I1时,将返回空引用-这很有意义,因为实现I2的模拟对象不会继承任何继承I1的对象。

问题是如何强制模拟对象同时从两个I1和Id继承?

Answers:


128

据我了解,您想创建一个实现两个接口的模拟。使用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.

现在,您可以设置期望并使用模拟程序,就像通​​常使用实现IFoo和的对象一样IBar

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


33
顺便说一句,对任何正在阅读设置的人来说,您都必须使用mock.AS <IBAR> .Setup(......)
John Nicholas,2010年

3
太棒了,效果很好。如果您需要执行.Setup,则可以一行完成所有操作,而无需先自己完成As <>,只需一行即可完成所有操作。
gakera

有没有办法将此设置设置为非接口?
主观现实
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.