Wednesday, June 22, 2011

Unit Testing Event Assignments

A quick note on how to test for event assignments using NUnit and Rhino.Mocks for stub and mock scenarios.

Stub scenario:

  1. [Test]
  2. public static void AssignPageEventHandlers_SetsPageEventHandlers()
  3. {
  4.     var stubView = MockRepository.GenerateStub<INavigationPageBaseView>();
  5.     var obj = new TestNavigationControllerRoot(stubView);
  6.     obj.AssignPageEventHandlers();
  7.     stubView.AssertWasCalled(v => v.PreInit += Rhino.Mocks.Arg<EventHandler>.Matches(eh => eh.Method.Name.Equals("PagePreInit")));
  8.     stubView.AssertWasCalled(v => v.Init += Rhino.Mocks.Arg<EventHandler>.Matches(eh => eh.Method.Name.Equals("PageInit")));
  9.     stubView.AssertWasCalled(v => v.Load += Rhino.Mocks.Arg<EventHandler>.Matches(eh => eh.Method.Name.Equals("PageLoad")));
  10. }

Mock scenario:

  1. [Test]
  2. public void PageLoadMasterController_ExpectedBehavior()
  3. {
  4.     var stubExProcessor = MockRepository.GenerateStub<IExceptionProcessor>();
  5.     stubExProcessor.Stub(e => e.GetCurrentUserErrorMessage()).Return("msg");
  6.  
  7.     var mockView = Mocks.StrictMock<IErrorView>();
  8.     using (Mocks.Ordered())
  9.     {
  10.         Expect.Call(() => mockView.PreInit += Arg<EventHandler>.Matches(eh => eh.Method.Name.Equals("PagePreInit")));
  11.         Expect.Call(() => mockView.Init += Arg<EventHandler>.Matches(eh => eh.Method.Name.Equals("PageInit")));
  12.         Expect.Call(() => mockView.Load += Arg<EventHandler>.Matches(eh => eh.Method.Name.Equals("PageLoad")));
  13.         Expect.Call(mockView.IssueMessageLiteralText = "msg");
  14.     }
  15.     Mocks.ReplayAll();
  16.     var obj = new ErrorController(mockView) { NavigationBuilderFactory = MockNavBuilderFactory, NavigationMasterController = MockNavigationMasterController };
  17.     obj.PageLoad(stubExProcessor);
  18.     Mocks.VerifyAll();
  19. }