Archive for TDD

Right tool for the job.

A few years ago while at uni, I read the book The Pragmatic Programmer: From Journeyman to Master by Andrew Hunt and David Thomas; the books aim is to help you to become a better programmer, and it provides loads of tips and best practices covering everything from estimating, testing to design guidelines. One of the main characteristics the book suggests will make you a better programmer is your ability to work with a broad range of technologies; so in my case, although I work with .net on a day to day basis, the suggestion is I should be familiar with other languages and platforms.

This has always made sense to me, for example; if you were going to write a program to search a folder for a text file containing a certain phrase, then although this would be relatively straight forward using .Net, it would literally be just a few lines using Perl. The same has been true with web technologies, although it may be easy to develop a simple website using the feature rich .net framework, it may be overkill for a small personal website that just maintains a photo gallery: using php it would be easy to incorporate a free off the shelf photo gallery system like Gallery 2 that is already fairly mature and tested for bugs.

I have used php on a few personal sites and think that it has benefited my html and css skills, but even with template engines like Smarty that separate the presentation layer, php to me has always felt a bit of a step backwards, when compared to asp.net.

I have just started a personal site wiisites that as the name suggests will simply maintain a directory of Nintendo wii web sites. I don’t really want to spend too much on hosting, so have opted to add the domain to my bluehost account and develop the site on the Linux platform; which would have usually meant Perl, or Php, but now there is a new contender for the open source title, Ruby on Rails.

Ruby is a fully object orientated language and Rails is a framework designed to greatly simplify web development based on the Model View Controller pattern. After following OnLamp tutorial which guides you through the easiest way to install and develop your first project, I can say that Ruby on Rails seems like a massive leap forward for open source web development; it appeals to me because its;

  • Object orientated, so should be easy enough to learn.
  • Follows the familiar Model View Controller pattern.
  • Greatly simplifies alot of the plumbing, like data access.
  • Ajax built in.
  • Embraces Agile development with unit testing built into the framework.
  • Is quick to use.
  • Cheap to host.

I have just bought a book on Rails and am looking forward to learning more about it, hopefully there will be lessons learned in Rails that could be applied to future .Net projects.
The Pragmatic Programmer: From Journeyman to Master Agile Web Development with Rails : A Pragmatic Guide (The Facets of Ruby Series)

Comments del.icio.us

First try of NMock2

When unit testing you should try to test the class of interest in isolation, this means removing any dependencies with other components; for example I needed to test in isolation a class that is instanciated by passing to it an object that implements IDataReader.

public DictionaryItem(IDataReader)

By creating a mock object for IDataReader, the class can be tested in isolation of the Data Access Layer (DAL).

You could either create the necessary mock object, by building your own class implementing IDataReader or use a mock object framework to help you.
For some time now NMock has been regarded as a powerful framework for generating mock objects, however the original NMock had a few limitations, one of which seemed to prevent nmock from being used to test a class that exposed an indexer. Fortunately NMock2 the new version of nmock, solves this problem. NMock2 is a total re-write micking jMock were “expectations are expressed in a more conversational style”; this makes NMock to easier to work with than its predecessor.

The following code creates the dataReaderMock mock object, which can then be passed to my DictionaryItem class in my unit test;

Mockery mocks = new Mockery();

IDataReader dataReaderMock = (IDataReader)mocks.NewMock(typeof(IDataReader));

Expect.AtLeastOnce.On(dataReaderMock).Method(”Read”).Will(Return.Value(true));
Expect.Once.On(dataReaderMock).Method(”Read”).Will(Return.Value(false));
Expect.Once.On(dataReaderMock).Method(”NextResult”).Will(Return.Value(false));
Expect.Once.On(dataReaderMock).GetProperty(”IsClosed”).Will(Return.Value(false));
Expect.Once.On(dataReaderMock).Method(”Close”);

Expect.Once.On(dataReaderMock).Get[”COL_1″].Will(Return.Value(4));
Expect.Once.On(dataReaderMock).Get[”COL_2″].Will(Return.Value(”col1ValueExpectedByUnitTest”));
Expect.Once.On(dataReaderMock).Get[”COL_3″].Will(Return.Value(”col2ValueExpectedByUnitTest”));
return dataReaderMock;

As you can see the expectations on a Mock2 object are easy to read; at least one expectation is made for each propety or method you expect to be called. The expectations reflect how the constructor of DictionaryItem will use the IDataReader; in my case the mock object reflects an DataReader with only one DataRow. The first part of the expectation defines how many times you expect the method to be called “Expect.AtLeastOnce.On”, the second part defines the name of the method, property or indexer expected to be called “Method(”Read”)” and the last part defines what value should be returned “Will(Return.Value(true))”.
If you use the mock object an nunit test if any of the expectations have not been met, the test will fail.

Download NMock2, NMock2 Tutorial

Test-Driven Development in Microsoft  .NET (Microsoft Professional)

Comments (3) del.icio.us