Example of Test Driving Code with Events
Following is a stripped down version of the actual code.
Start with a simple Test:
private static void ContinueMethod(object sender, EventArgs arg) { ((Eventful)sender).ContinueExecutionFor("ContinueMethod"); } [Test] public void EventHandlerCanRequestFurtherCodeExecution() { var eventful = new Eventful(); eventful.ContinuationHandler += ContinueMethod; eventful.Execute(); Assert.AreEqual("ContinueMethod wants to execute more logic", eventful.State); } |
and then wrote the production code:
public class Eventful { public string State; public event EventHandler<EventArgs> ContinuationHandler; public void Execute() { // logic to get ready var args = new EventArgs(); //stuff args with some data ContinuationHandler(this, args); } public void ContinueExecutionFor(string delegateName) { State = delegateName + " wants to execute more logic"; // some logic } } |
The wrote the next Test:
private static void StopMethod(object sender, EventArgs arg) { // no call back } [Test] public void EventHandlerCanStopFurtherCodeExecution() { eventful.ContinuationHandler += StopMethod; eventful.Execute(); Assert.IsNull(eventful.State); } |
and this went Green.
Then I wondered what happened if there were no registered event handlers. So I wrote this test.
[Test] public void NoOneIsInterestedInThisEvent() { eventful.Execute(); Assert.IsNull(eventful.State); } |
This resulted in:
System.NullReferenceException : Object reference not set to an instance of an object. at Eventful.Execute() in Eventful.cs: line 17 at EventTest.NoOneIsInterestedInThisEvent() in EventTest.cs: line 46 |
Then I updated the Execute() method in Eventful class:
public void Execute() { // logic to get ready if (ContinuationHandler != null) { var args = new EventArgs(); //stuff args with some data ContinuationHandler(this, args); } } |
This made all the 3 tests go Green!