RhinoMocks IQueryable<T> helper
Posted by Garry Shutler in Extension methods, Unit testing
After reading Lee Brandt's post about how my answer to his question on Stack Overflow helped with testing the logic of his queries I realised that people might find one of my test helper extension methods useful.
I found that in my tests I had to mock out the Query<T> function quite a lot which would look something like this:
1 protected override void EstablishContext()
2 {
3 var projects = new[]
4 {
5 Build.Project().WithName("AAAAAAA").Create(),
6 Build.Project().WithName("CCCCCCC").Create(),
7 Build.Project().WithName("BBBBBBB").Create()
8 };
9
10 Mock<IUnitOfWork>()
11 .Stub(x => x.Query<Project>())
12 .Return(projects.AsQueryable());
13 }
This was adding quite a lot of noise to my tests. I like to keep my tests as clean as possible to make them easier to scan when you need to review and understand them. Because of this I wanted to simplify the stubbing so there was as little code as possible.
This was made possible by this simple extension method:
1 public static IMethodOptions<IQueryable<TEntity>> ReturnQueryable<TEntity>
2 (this IMethodOptions<IQueryable<TEntity>> options, params TEntity[] items)
3 {
4 return options.Return(items.AsQueryable());
5 }
The magic sauce in this is the items parameter. I’ve used the params modifier so that I can provide any number of TEntity objects for the IQueryable function to return.
This tidies the above setup code down to this:
1 protected override void EstablishContext()
2 {
3 Mock<IUnitOfWork>()
4 .Stub(x => x.Query<Project>())
5 .ReturnQueryable(
6 Build.Project().WithName("AAAAAAA").Create(),
7 Build.Project().WithName("CCCCCCC").Create(),
8 Build.Project().WithName("BBBBBBB").Create()
9 );
10 }
I find this much cleaner and easier to read, hope this helps someone out.
Happy testing!
Related posts:
This entry was posted on at Saturday, May 09, 2009 and is filed under Extension methods, Unit testing. You can follow any responses to this entry through the RSS 2.0. You can leave a response.
