views:

125

answers:

1

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?

+5  A: 

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

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.

Håvard S
cool, thankyou - this is exactly what i needed.
John Nicholas
BTW to anyone reading when you do the setups you have to use the mock.AS<IBAR>.Setup(......)
John Nicholas