Anonymous Sequences With AutoFixture by Mark Seemann
When writing unit tests you often need to deal with sequences and collections, populating lists with anonymous data as part of setting up a Fixture.
This is easy to do with AutoFixture. While you can obviously create a simple loop and call CreateAnonymous from within the loop, AutoFixture provides some convenient methods for working with sequences.
Equivalent to the CreateAnonymous method, the Fixture class also includes the CreateMany method that creates a sequence of anonymous variables. CreateManyAnonymous might have been a more concise and consistent name for the method, but I felt that this was a bit too verbose.
This will create an IEnumerable<string>:
Fixture fixture = new Fixture(); var strings = fixture.CreateMany<string>();
Obvously, you can create sequences of whatever type you want, as long as AutoFixture can figure out how to create instances of the type:
var myInstances = fixture.CreateMany<MyClass>();
Being able to create sequences of anonymous data is nice, but sometimes you need to add multiple anonymous items to an existing list (particularly if that list is a read-only property of your SUT).
To support that scenario, the Fixture class also has the AddManyTo method that can be used like this:
var list = new List<MyClass>(); fixture.AddManyTo(list);
This simply creates many anonymous MyClass instances and adds them all to the list. Once more, AddManyAnonymousTo might have been a more precise name, but again I chose a less verbose alternative.
If you want more control over how the instances are created, a more explicit overload of AddManyTo gives you that.
var list = new List<int>(); var r = new Random(); fixture.AddManyTo(list, () => r.Next());
The above examples adds many random numbers to the list of integers, since the second parameters is a Func<T> used to create the instances.
By default, these methods all create 3 anonymous variables when called, since 3 is a good equivalent for many. If you want a different number of instances to be created, you can modify the RepeatCount property.
fixture.RepeatCount = 10; var sequence = fixture.CreateMany<MyClass>();
The above example will create an IEnumerable<MyClass> with 10 anonymous MyClass instances, while this will add 7 anonymous instances to the list variable:
var list = new List<MyClass>(); fixture.RepeatCount = 7; fixture.AddManyTo(list);
AutoFixture provides some convenient methods for creating and managing collections of anonymous data. While it may seem simple (and it is), in a future post I will demonstrate how it can save you quit a bit of infrastructure code, and enable you to write unit tests that are shorter, more concise and more maintainable.