I am using NHibernate and Rhinomocks and having trouble testing what I want. I would like to test the following repository method without hitting the database (where _session is injected into the repository as ISession):
public class Repository : IRepository { (... code snipped for brevity ...) public T FindBy<T>(Expression<Func<T, bool>> where) { return _session.Linq<T>().Where(where).FirstOrDefault(); } }
My initial approach is to mock ISession, and return an IQueryable stub (hand coded) when Linq is called. I have a IList of Customer objects I would like to query in memeory to test my Linq query code without hitting the db. And I’m not sure what this would look like. Do I write my own implementation of IQueryable? If so, has someone done this for this approach? Or do I need to look at other avenues?
Thanks!
How I’ve done this test is to not pass the expression to the repository, instead expose IQueryable giving the repository an interface such as:
Easily implemented like so:
This means that instead of calling your method on the repository like:
You can do:
Or the LINQ syntax:
This then means you can get the same test by mocking the repository out directly which should be easier. You just get the mock to return a list you have created and called AsQueryable() on.
As you have pointed out, the point of this is to let you test the logic of your queries without involving the database which would slow them down dramatically.