MOQ - how to mock an interface that needs to be cast to another interface?

what I want to do is construct a moq for I1 - which is fine ... however in the course of the method that I am testing that uses this mock I need to cast it to I2 in order to access some properties that are not on I1

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

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

I then have some objects

Class O1 : I1 {}

and

Class O2 : O1 , I2 {}

the problem is that when i have an instance of a I2 implementing object I can cast it to I1 in order to access the methods that are implmented through that interface. In code this is not a problem and everythign works as expected.

The only problem comes when writing a unit test on that class.

The interfaces also expose a method called GetNewInstance which returns an initialised instance of the the implementing object cast into the IGetNewInstance interface ... i can usually mock this fine and make it return itself (and so I keep working with the mock object).

however when you try to cast this returned object of type I2 into I1 a null reference results - this makes sense as the mock object that implements I2 does not inherit from anything that inherits I1.

the question is how can i force the mock object to inherit from both I1 ansd I2 at the same time?

66
задан Ruben Bartelink 18 August 2010 в 08:57
поделиться

1 ответ

Как я вас понимаю, вы хотите создать макет, реализующий два интерфейса. С 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 вы можете просто настроить ожидание, которое возвращает сам макет.

113
ответ дан 24 November 2019 в 15:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: