Some code I use to help me do TDD
This is a generic builder class which separates off the business of creation into a reusable component
// create a builder for a mocked interface (using Moq)
var builder = new Builder<IThingy>(Mock.Of<IThingy>)
.With(x =>
{
x.Name = "Some Name";
x.SetValue("Some Value");
});
// create an instance
var instance = builder.Build();
// create an other instance, override the name
var otherInstance = builder
.Build(x => x.Name = "Other Name");
// create 100 instances, then 10 overriding the name, the index is supplied too
var instances = builder
.Build(100)
.Build(10, (x, i) => x.Name = "Other Name")
.ToList();
The builder implements IEnumerable and is has a lazy iterator, which means everytime you enumerate it you will get a new set of objects
Call .ToArray() or .ToList() to fix a set to a variable (see above)
These are some builders to get hold of the usual type of data you may need
IBooleanBuilder Boolean { get; }
IIntegerBuilder Integer { get; }
IDoubleBuilder Double { get; }
IDateTimeBuilder DateTime { get; }
ITextBuilder Text { get; }
IPersonBuilder Person { get; }
IEmailBuilder Email { get; }
IWebsiteBuilder Website { get; }
There are some simple extensions to IEnumerable to allow you to random elements
// Gets a single random element from an IEnumerable<T>
T OneOf<T>(this IEnumerable<T> items)
// Gets an exact number of random elements from an IEnumerable<T>
IEnumerable<T> ManyOf<T>(
this IEnumerable<T> items, int exactCount)
// Gets a random number of random elements from an IEnumerable<T> given a range
IEnumerable<T> ManyOf<T>(
this IEnumerable<T> items, int minCount, int maxCount)
Also some extensions to find embedded resources
// Find an embedded resource as a stream in the passed type assembly by name
Stream FindResourceStream(this Type type, string name)
// Find an embedded resource and transform from stream to another type
T FindResource<T>(this Type type, string name, Func<Stream, T> transformer)
// Find an embedded resource and transform to a string
string FindResourceString(this Type type, string name)
// Find an embedded resource and transform to an image
Image FindResourceImage(this Type type, string name)
There is also some test data
IEnumerable<bool> Booleans { get; }
IEnumerable<string> PersonFirstNamesMale { get; }
IEnumerable<string> PersonFirstNamesFemale { get; }
IEnumerable<GenderTypes> DataGenders { get; }
IEnumerable<string> PersonLastNames { get; }
IEnumerable<string> WebDomains { get; }
IEnumerable<string> EmailTypes { get; }
IEnumerable<char> Chars { get; }
IEnumerable<char> Letters { get; }
IEnumerable<char> Numbers { get; }
for example
// get a random number of male first names, between 10 and 20
var firstNames = TestData.PersonFirstNamesMale
.ManyOf(10,20);
This is used to time how long a piece of code takes to run.
Wrap your code in a delegate and call the Benchmark.Run with a number of iterations or even a list of iteration to get figures for performance over an increasing number of iterations
var result = Benchmark
.Run(() => [Your Action], [Number of iterations]);
for example, run Thread.Sleep 10 times
var result = Benchmark
.Run(() => Thread.Sleep(10), 10);
for example, run Thread.Sleep 10 times, 100 times and 1000 times
var result = Benchmark
.Run(() => Thread.Sleep(10), 10, 100, 1000);
The result ToString() gives a summary of the timings including the average and you can format this using config (see app.config in the Testing project)
<Testing.Properties.Settings>
<setting name="BenchmarkResult_toString" serializeAs="String">
<value>{0}, av {1}, {2}x</value>
</setting>
<setting name="BenchmarkResultList_toString" serializeAs="String">
<value>{0}, av {1}, {2}x</value>
</setting>
</Testing.Properties.Settings>
{0} time {1} average {2} iterations