Im using Moq to create mocks of a data set.
I have created a little helper class that allows me to have an in memory storage instead of a database that makes unit testing a breeze. That way I can add and remove items from my mock data set, this allows me to test my insert and delete service calls.
During the setup of the mock I have a line that looks like the following
this.Setup(i => i.AcademicCycles).Returns(mockStore.GetList<AcademicCycle>());
My mock has a lot of properties so I would like to perform this setup step using reflection. I have managed to the Returns
part of the process working via reflection but I am stuck on the lambda method to Setup
.
Setup
takes an
Expression<Func<GoalsModelUnitOfWork, IQueryable<AcademicCycle>>>
that corresponds to the i => i.AcademicCycles
and I would like to create this dynamically. Using reflection I have the following:
The name of the property: "AcademicCycles"
The type IQueryable<AcademicCycle>
The type AcademicCycle
I also have the instance of the i
in the lambda statement which is a GoalsModelUnitOfWork
This method ought to construct the lambda expression. Since you are invoking the Setup method by reflection, you do not need a strongly-typed lambda expression; you are going to pass it as part of an object array when you call
Invoke
:I don't think you actually need the parameter name. If I'm right about that, you could simplify a bit:
The code to create the expression dynamically would be like this:
The result will have the desired type, but the problem is that the return type of
Expression.Lambda()
isLambdaExpression
and you can't perform a type cast toExpression<Func<...>>
to pass it as parameter to your setup function because you don't know the generic type parameters for theFunc
. So you have to invoke theSetup
method by reflection, too:I decided to take a crack at it and ended up with this god awful piece of code.
I am no reflection expert and this is just a first attempt to get something working. I'd be very interested in what other approaches people have, or whether any of the relfection wrapper libraries can make this nicer.