I was working on a small utility which generates XML based upon a given class (which is already XML serializable). I wanted to generate random data just so I could see how the end XML looked in case I needed to tweak the XSD.
Source for the utility is available on AutoGenXml.
I figured somebody must have already approached such a problem, and thankfully I was right. There are a few solutions for populating object data. I ended up trying out two different libraries, AutoFixture and NBuilder.
Disclaimer: I have literally only just started using these libraries, so I’ve yet to find all the good and/or bad points of each library.
Let’s take a real quick look at what these libraries can do.
Test object
Let’s start out by defining an object hierarchy to test this two libraries out on. Mine looks like this
public class Album { public string Title { get; set; } public string RecordLabel { get; set; } public Artist Artist { get; set; } public string Genre { get; set; } } public class Artist { public string Name { get; set; } public BandMember[] Band { get; set; } } public class BandMember { public string FirstName { get; set; } public string LastName { get; set; } public string Talent { get; set; } }
AutoFixture
AutoFixture source can be found on AutoFixture.
We can create objects with AutoFixture (hence using it as the factory for our objects) and it returns a populated object hierarchy.
Let’s look at the code (it’s pretty simple)
var fixture = new Fixture(); var album = fixture.Create<Album>();
The album will now have data in all fields and the Artist and BandMember properties are also created and data supplied.
Whilst it’d obviously be easy enough for us to create an object multiple times if we wanted a list of Albums but AutoFixture also supplies this code to do the same thing
var fixture = new Fixture {RepeatCount = 10}; var albums = fixture. Repeat(fixture.Create<Album>). ToArray();
NBuilder
NBuilder source can be found on NBuilder.
NBuilder also supplies a factory pattern for both creating our objects and populating the object.
Here’s the code
var album = Builder<Album> .CreateNew() .Build();
NBuilder uses a fluent style interface and offers options for creating multiple items (i.e. an IList<> of objects). There’s also a mechanism for us to intercept the object population step and supply our own data. So whilst in the usage shown above, we don’t have the object heriarchy created, we can create this ourselves fairly easily using
var albums = Builder<Album> .CreateListOfSize(10) .All() .With(a => a.Artist = Builder<Artist>.CreateNew() .With(b => b.Band = Builder<BandMember> .CreateListOfSize(3) .Build().ToArray()) .Build()) .Build();
References
This is a great post on using NBuilder with Faker which allows us to populate the objects with more realistic data than the default process.