In my project I am using the following approach to querying data from the database:
To isolate testing just to just the extension method i wouldn't mock anything. Create a list of Invoices in a List() with predefined values for each of the 3 tests and then invoke the extension method on the fakeInvoiceList.AsQueryable() and test the results.
Create entities in memory in a fakeList.
var testList = new List<Invoice>();
testList.Add(new Invoice {...});
var result = testList().AsQueryable().ByInvoiceType(enumValue).ToList();
// test results
If it suits your conditions, you can hijack generics to overload extension methods. Lets take the following example:
interface ISession
{
// session members
}
class FakeSession : ISession
{
public void Query()
{
Console.WriteLine("fake implementation");
}
}
static class ISessionExtensions
{
public static void Query(this ISession test)
{
Console.WriteLine("real implementation");
}
}
static void Stub1(ISession test)
{
test.Query(); // calls the real method
}
static void Stub2<TTest>(TTest test) where TTest : FakeSession
{
test.Query(); // calls the fake method
}