Tim Van Wassenhove

Passionate geek, interested in Technology. Proud father of two

22 Sep 2008

Presenting ApplicationEnvironment

Imagine we are an ice cream vendor. During summer months our available capacity is twice as high as in the rest of the year. In code this problem looks like the following

public int AvailableCapacity
{
	get
	{
		DateTime now = DateTime.UtcNow;

		if (new DateTime(now.Year, 6, 1) <= now && now <= new DateTime(now.Year, 9, 1) ) { return 10000; } 
		else { return 5000; } 
	} 
}

This code is pretty difficult to test because it depends on DateTime.UtcNow. In order to get control over that dependency i have defined an ApplicationEnvironment and rewritten the code as following

public int AvailableCapacity
{
	get
	{
		DateTime now = ApplicationEnvironment.Instance.CurrentDateTime;

		if (new DateTime(now.Year, 6, 1) <= now && now <= new DateTime(now.Year, 9, 1) ) { return 10000; } 
		else { return 5000; } 
	} 
}

Now i can use my ConfigurationFileSession to test this code

[TestMethod]
public void ShouldReturn10000InSummer()
{
	using (new ConfigurationFileSession("Summer.config"))
	{
		ApplicationEnvironment.Instance.Refresh();
		Assert.AreEqual(10000, new IceCreamPlant().AvailableCapacity);
	}
}

[TestMethod]
public void ShouldReturn5000InWinter()
{
	using (new ConfigurationFileSession("Winter.config"))
	{
		ApplicationEnvironment.Instance.Refresh();
		Assert.AreEqual(5000, new IceCreamPlant().AvailableCapacity);
	}
}