Testing for successful event hookup

17 views
Skip to first unread message

TheMightyKumquat

unread,
Jul 7, 2009, 1:18:34 AM7/7/09
to Rhino.Mocks
I am a newcomer to writing automated unit tests using Rhino Mocks and
I'd appreciate any help I can get here.

I’m testing a class called ClientSearchPresenter. The
ClientSearchPresenter class has a property of type IClientSearchView,
which has two private events.

I’m stuck testing the OnViewLoaded method. It wires up two methods in
the presenter as event handlers to the View property’s events, then
calls a private method.

I want to test whether the event handlers have been successfully
attached. I have no freakin' idea how to do this, unfortunately.

Does anyone know of a way to access the property, get its events and
see whether there are any event handlers attached?

Alternatively, I could just call the events and then test whether the
code that they run has executed. I don’t know how to do this from my
test code, either, though. Does anyone have any ideas?

The following is
- code for the class being tested
- code for the interface that the property I want to access (the one
with the private events)
- my test code so far.

Public Class ClientSearchPresenter
Inherits Presenter(Of IClientSearchView)

Public Sub New(<Dependency()> ByVal controller As
IClientSearchController)

_controller = controller
End Sub

Private _controller As IClientSearchController
Public ReadOnly Property Controller() As
IClientSearchController
Get
Return _controller
End Get
End Property

Public Overrides Sub OnViewLoaded()

AddHandler View.ClearClicked, AddressOf View_ClearClicked
AddHandler View.SearchClicked, AddressOf
View_SearchClicked

LoadKeyOnView()
End Sub

Private Sub View_ClearClicked(ByVal sender As Object, ByVal e
As EventArgs)

Controller.ClearSearch()
LoadKeyOnView()
End Sub

Private Sub View_SearchClicked(ByVal sender As Object, ByVal e
As DataEventArgs(Of ClientSearchKeyDocument))

Controller.SearchForClient(e.Data)
LoadKeyOnView()
End Sub

Private Sub LoadKeyOnView()

View.Key = Controller.SelectForSearch()
End Sub

End Class

Public Interface IClientSearchView

Event ClearClicked As EventHandler
Event SearchClicked As EventHandler(Of DataEventArgs(Of
ClientSearchKeyDocument))

WriteOnly Property Key() As ClientSearchKeyDocument

End Interface

''<summary>
''A test for OnViewLoaded
''</summary>
<TestMethod()> _
Public Sub ClientSearchPresenter_OnViewLoadedTest()
mocks = New MockRepository()
mockState = New PrePostMockState()
mockNavigator = New NavigatorMock(mockState)

Dim controller As ClientSearchController
' Have RhinoMocks dynamically generate a controller for use in
the presenter's constructor
controller = mocks.Stub(Of ClientSearchController)
(mockNavigator)

' The onViewLoaded method will access a method on the
presenter's View property, so
' we need to mock one up.
Dim mockView As IClientSearchView
mockView = mocks.Stub(Of IClientSearchView)()

Dim fakeKey As New ClientSearchKeyDocument()
mockView.Key = fakeKey

Dim target As ClientSearchPresenter = New ClientSearchPresenter
(controller)
' target.View is instantiated as Nothing, so need to set a
view for it to access
target.View = mockView

target.OnViewLoaded()

' TODO – I want to access the events in the target.View object
and see if they
' have event handlers attached here - How?
' TODO – alternatively, I want to raise an event that should
be handled by the
' target.View and see if it hits the method in the presenter –
how?

End Sub

ulu

unread,
Jul 10, 2009, 8:38:54 AM7/10/09
to Rhino.Mocks
Search the wiki (or Google) for GetEventRaiser

ulu

BTW there's no such thing as private event in an interface, you know.

Berryl Hesh

unread,
Jul 13, 2009, 4:11:38 PM7/13/09
to Rhino.Mocks
@Kumquat

This can be a bit frustrating to work through the first time. There
are two basic event tests I like to use:
1) test the event is registered (wired, routed, attached) correctly
2) invoke the event and test expected behavior

Here's how I might do test number 1 (in C#, sorry - I don't do VB)

[Test]
public void
ClearClickedEvent_InstantiatingTheController_RegistersEventToViewClearClicked
()
{
// ARRANGE - set up a mock of your view
var view = MockRepository.GenerateMock<IClientSearchView>();
// ACT - make a new controller
var c = new Controller(...)
// ASSERT - this is all you need to do
view.AssertWasCalled(x => x.ClearClicked += c.ViewClearClicked );
}

Test 2 is more involved and likely be more than one test, but the main
idea is to use the event raiser to raise your event, ie:
view.Raise(x => x.ClearClicked += null, this,
EventArgs.Empty); // EventArgs need not be EventArgs.Empty

and then assert a call was made that verifies the behavior you expect.

Hope that helps.

Berryl

Stefan Steinegger

unread,
Jul 20, 2009, 4:00:11 PM7/20/09
to Rhino.Mocks
Generally, you should not test if the events have been registered
unless you can't test anything more useful.

You should always test the behaviour of your unit under test. It
shouldn't matter, _how_ it does the job. Registering events is "how".

So just let the unit under test register to the mocks events and fire
it using the EventRiser, just like Berryl Hesh explained. Then check
the result, preferably by normal Asserts (property states) to avoid
testing on more "hows".
Reply all
Reply to author
Forward
0 new messages