Method chaining with deferring object creation

I have decided to write a couple of posts about how I used Method Chaining to help solve and better handle the creation of test data within my Unit Tests. This post and the example code via GitHub shows how I created test data using Method Chaining in a more generic form. There will be more posts to come regarding how this test data gets persisted into a in-memory database which will get used in XUnit Tests.

For my problem, I had to build up test data that will be used within a number of Unit Tests. Creating objects and assigning values to properties through Factory classes is considered a fairly normal approach, however being able to build up objects using method chaining gives me the flexibility to create objects with different characteristics.

For example, var foo = MyFooBuilder.Create().WithName(“My Foo”).WithAge(5).WithCar(“Audi”).Build(). This allows me to build up a foo object using a nice fluent chaining of methods compared to var foo = new Foo() { Name = “My Foo”, Age = 5, Car = “Audi” }. This allows me to keep all the Foo created code in a nice and tidy builder class which provides the flexibility to extend the builder to introduce new characteristics in the future.

What I ended up creating was a generic builder class that allows me to use a object of type T, build up a set of actions to get a newly created object. for example, var foo = MyBuilder.Create().WithProperty(new { Name = “MyPropertyName”, Value = “MyValue” }).Build();

You can view my builder class at https://github.com/codelabnz/BuilderExample

Creating a generic list of anonymous types

Scenerio

I have a simple HTML form on a ASP.NET Web page. This form is to post a number of values including several elements that are compulsory to perform several actions on the server. As we know, when we post values to ASP.NET these are available for Request.Form. All we know is the key and value in the NameValueCollection object. I want to be able to check if several values are present and if they are not, return the respective element meta-description rather than the original name.

For Example If we post a name field called formName, we want to return “You must enter data into the fields: Form Name”.

Solution

I used a generic list of a anonymous type. My anonymous type has a Name and a Value property.

var nameValueInstance = new { Name=”formName”,Value=”Form Name”}

I created a list factory that pases in a array of generic type interfaces and returns a generic list of the generic type interface.

private static List<T> MakeList<T>(params T[] items)

{

List<T> newList = new List<T>(items);

return newList;

}

I was then able to do the following to create a generic list of anonymous types:

var fields = MakeList(new { Name = “price”, Value = “Price” }, new { Name = “productname”, Value = “Product Name” });

From here I was able to interate through the list and validate the Form elements and return the nessessary output.

References:

http://kirillosenkov.blogspot.com/2008/01/how-to-create-generic-list-of-anonymous.html