Using TypeMock to mock nHibernate's ISession.Load<T>

The development team I work with uses nHibernate for our data-access and data persistence needs. We also use Typemock Isolator to mock classes and methods during unit tests. This is especially handy to mock certain nHibernate API calls to make sure our unit tests are more isolated. Today, I needed a way to mock nHibernate's ISession.Load() for all data objects in the project that use nHibernate. To mock a generic method (like ISession.Load()) I would normally do the following:

Mock<ISession> mock = MockManager.MockObject<ISession>(Constructor.Mocked);
mock.AlwaysReturn("Load", new DynamicReturnValue((parameters, context) =>
{
   // assume MyClass has a constructor with int Id parameter
   return new MyClass( (int)parameters[0] );
}), typeof(MyClass));

That means anytime I call ISession.Load(1);, I get back a new MyClass object with 1 passed into the constructor. But what if I have 50 different classes similar to MyClass that I want to mock like this? The simplest way is to iterate over a list of types needed and mock them as well, like below:

Mock<ISession> mockSession = MockManager.MockObject<ISession>(Constructor.Mocked);
 
// Retrieve all the types in the same assembly as MyClass
// and mock those types that have the "Id" property
Assembly assembly = Assembly.GetAssembly(typeof(MyClass));
foreach (Type type in assembly.GetTypes())
{
   Type objType = type; // this line is needed because 'type' will cause 
                        // issues with the anonymous method below.
 
   if (objType.GetProperty("Id") != null)
   {
      mockSession.AlwaysReturn("Load", new DynamicReturnValue((parameters, context) =>
      {
         return Activator.CreateInstance(objType, parameters[0]);
      }), objType);
   }
}

Obviously you can change the foreach loop to use whatever list of types you need, but this certainly beats having to duplicate code!

An error was discovered processing the <Security> header

A coworker and I were troubleshooting an issue we were having concerning a .NET call to a webservice that used WSE Security. Our client derived from Microsoft.Web.Services2.WebServicesClientProtocol and every time we tried to call the webservice this error would appear:

An error was discovered processing the <Security> header

A quick search on Google returned a quick, easy solution: verify that client and server have their system time in synch (a 5 minute window is allowed). Once the server time (about 6 minutes apart) was fixed the issue immediately disappeared.

Staging environments via Linode are awesome!

This weekend I wanted to upgrade my Linode server from Ubuntu 7.10 to 8.04 and also to upgrade my Trac server to version 0.11. Now the quickest method would have been to just change the /etc/apt/sources.list file to point to hardy and do a sudo apt-get update; sudo apt-get dist-upgrade and then download the latest version of Trac. But not knowing if my sites would still be running combined with the fact I wasn't quite happy with the way I had set things up originally, I decided to buy another Linode server and set up a staging environment.

Honestly, it wasn't hard at all! Once I installed 8.04 fresh on the stage server, I installed apache, mysql, php, trac, subversion, and other necessary packages, set it up as if it was my primary server (creating aliases like stage.stevenkuhn.net where I could see how it looked), and then copied the new disk image back to the old server. Once there I restarted the old server with the new disk image and since all my original domains still pointed to my production server, I had a very limited downtime. When I was finished, I canceled my second server and received a pro-rated created. I spent less than $2 for having a limited-time staging environment! Linode is the best!

A Special Blend

Welcome to my little corner of the blogosphere! From the title of this post, the main plan for this site is to give what I call a special blend of .NET development and Linux knowledge, along with my other random thoughts and ideas. :)

For those of you coming across this who don't know me (or would like to know more), I live in the Chicago area where my work primarily consists of ASP.NET/C# development using different technologies such as AJAX.NET, nHibernate and TypeMock to develop websites specifically for the needs of people inside the company I work for. I'm also involved with a LEGO®-based Half-Life 2 mod called Block Party, where I'm mainly responsible for the programming aspect as well as maintaining our development site. As far as Linux is concerned, I've been a fan since I bought my first RedHat Linux 4.2 discs from Best Buy over back in 1997. :) I've since latched onto Ubuntu, running it on my home computers as well as the Linode I'm using to host this site. I must say Linux has sure grown leaps and bounds from the time I first used it!

When I'm not plugging away with code or tweaking my home network, you can usually find me hitting up a couple different game servers on Team Fortress 2, which has definitely been my game of choice as of late. :)

Again welcome to my site and hope you enjoy your stay!

Syndicate content