Verifying you Data Access Layer when using NHibernate, Active Record, And Friends

time to read 3 min | 574 words

I sometimes run into situations where people think that ORM is a magic word for no-work-required. This is especially true when they tend to realize that a few hours (on a small project, or a few hours here and there on a larger one) in front of an XML editor and some really simple classes, can more or less eliminate the need of a DAL.

It's tempting, I can write a functional DAL very quickly, but I also need to make sure that I test it. The problem is that you may be tempted to leave it like that, and that is where the danger lies. Let's imagine a very simple blog, where you've a many to one connection beteen posts and a blog, and you want to work with it. I can create the code for that in under ten minutes, in notepad, from memory alone (and no, it's not a boast, it's proof to how good the whole toolset is). But what then? Take a look at this code:

Blog blog = new Blog("My"); 
Blog.Posts.Add(new Post("noise")); 
blog.Save();
using(new SessionScope())//for lazy loading 
{
  Blog fromDB = Blog.FindWithId(blog.Id);//verify save works

  //for each field, verify that the correct value was returned 
  //this is VERY important if you're going to play typing games, such as saving 
  //bool to tinyint columm, saving enums, etc...
  Assert.AreEquals("My", fromDb.Name);

  bool isLoaded = NHibernateUtil.IsInitialized(fromDb.Posts);
  Assert.IsFalse(isLoaded);//verify lazy loading

  int count = fromDb.Posts.Count;// loads the lazy collection, also 
  Assert.AreEqual(1, count);// Verify that cascade works from blogs to poss

  Post postFromDb = Collection.First(fromDb.Posts);
  Assert.AreEquals("noise", postFromDb.Content);//verify that saving a post works
}

This is one of the simplest possible tests, and check out how many failure point it has. You have to have this kind of coverage over all your entities (although I hate this word). If you don't, you can very easily get into a situation where the most minor change will break you code, and you'll not understand why this is happening.