How do you unit test a method containing a LINQ expression?
- by Phil.Wheeler
I'm struggling to get my head around how to accommodate a mocked method that only accepts a Linq expression as its argument. Specifically, the repository I'm using has a First() method that looks like this:
public T First(Expression<Func<T, bool>> expression)
{
return All().Where(expression).FirstOrDefault();
}
The difficulty I'm encountering is with my MSpec tests, where I'm (probably incorrectly) trying to mock that call:
public abstract class with_userprofile_repository
{
protected static Mock<IRepository<UserProfile>> repository;
Establish context = () =>
{
repository = new Mock<IRepository<UserProfile>>();
repository.Setup<UserProfile>(x => x.First(up => up.OpenID == @"http://testuser.myopenid.com")).Returns(GetDummyUser());
};
protected static UserProfile GetDummyUser()
{
UserProfile p = new UserProfile();
p.OpenID = @"http://testuser.myopenid.com";
p.FirstName = "Joe";
p.LastLogin = DateTime.Now.Date.AddDays(-7);
p.LastName = "Bloggs";
p.Email = "[email protected]";
return p;
}
}
I run into trouble because it's not enjoying the Linq expression:
System.NotSupportedException:
Expression up = (up.OpenID =
"http://testuser.myopenid.com") is not
supported.
So how does one test these sorts of scenarios?