Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mocking generics that implement multiple interfaces

Tags:

c#

mocking

moq

Here's my class implementation where the generic is implementing two interfaces...

public class ClassA<TGeneric> : where TGeneric: IInterfaceA, IInterfaceB

I want to Mock ClassA. However, I can't use

var mock = new Mock<Class<A<IInterfaceA>>();

or

var mock = new Mock<Class<A<IInterfaceB>>();

since the generic requires implementations of both interfaces. I know you can mock objects with multiple interfaces by using the As() method on the moq, but I don't really have an object here but a generic type.

Thoughts?

Thanks...

like image 716
Levitron Avatar asked Apr 22 '13 17:04

Levitron


2 Answers

You could define an interface that includes both interface A and B (in your test project, for testing purposes), then use that in your mock.

public interface ICanTestAAndB : IInterfaceA, IInterfaceB {}

var mock = new Mock<ClassA<ICanTestAAndB>>();
like image 178
driis Avatar answered Oct 23 '22 10:10

driis


As alternative to the accepted answer you can achieve what you need by casting the mocked object to dynamic and at runtime it will work as expected.

void Main()
{
    var mockA = new Mock<IIntA>();
    mockA.Setup(a => a.DoA()).Returns(3);

    var mockB = mockA.As<IIntB>();
    mockB.Setup(iib => iib.DoB()).Returns(7);

    dynamic d = mockB.Object;

    TakeBoth(d);
}

void TakeBoth<T>(T obj) where T : IIntA, IIntB
{
}

public interface IIntA { int DoA(); }
public interface IIntB { int DoB(); }
like image 31
mdonatas Avatar answered Oct 23 '22 09:10

mdonatas