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

我想做的是为 I1构造一个 moq-这很好... 然而在我正在测试的使用这个 mock 的方法过程中,我需要将它强制转换为 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和 I2继承?

34123 次浏览

The way I understand you, you want to create a mock that implements two interfaces. With Moq, that is as simple as this:

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.

Now, you can set up expectations and use your mock as you would normally use the object implementing both IFoo and IBar.

For your GetNewInstance method, you can just set up an expectation that returns the mock itself.