Hi,
It should have been easy, but you have uncovered a bug
The test should have used
mockedEvent.InstanceCount :
[Test,VerifyMocks]
public void ObserverTest() {
Mock<ObjectWithEvent> objWithEvent = MockManager.MockObject<ObjectWithEvent>();
MockedEvent mockedEvent = objWithEvent.ExpectAddEvent("AnEvent");
objWithEvent.ExpectRemoveEvent("AnEvent");
int numberOfRegisteredHandlers = 0;
objWithEvent.ExpectGetAlways("IsInStateX",(DynamicReturnValue) delegate(object[] args, object obj)
{
numberOfRegisteredHandlers = mockedEvent.InstanceCount;
return true;
});
Observer observer = new Observer(objWithEvent.MockedInstance);
mockedEvent.Fire(objWithEvent.MockedInstance);
Assert.AreEqual(1,numberOfRegisteredHandlers);
}
But there is a bug and the mockedEvent.InstanceCount doesn't decrease when the event is removed. You have found a good workaround.
public bool HasListeners(MockedEvent mockedEvent)
{
try
{
mockedEvent.GetEventHandle();
return true;
}
catch (TypeMockException e)
{
return false;
}
}
Now we can test:
[Test,VerifyMocks]
public void Observer_WhenIsInStateXIsCalled_EventIsStillRegistered() {
// Create a fake and expect event to be added and removed
Mock<ObjectWithEvent> objWithEvent = MockManager.MockObject<ObjectWithEvent>();
MockedEvent mockedEvent = objWithEvent.ExpectAddEvent("AnEvent");
objWithEvent.ExpectRemoveEvent("AnEvent");
// when in IsInStateX grab the event and see if anyone is listening
bool hasRegisteredHandlers = false;
objWithEvent.ExpectGetAlways("IsInStateX",(DynamicReturnValue) delegate(object[] args, object obj)
{
hasRegisteredHandlers = HasListeners(mockedEvent);
return true;
});
// run the code and fire the event
Observer observer = new Observer(objWithEvent.MockedInstance);
mockedEvent.Fire(objWithEvent.MockedInstance);
// was the event still registered in IsInStateX?
Assert.IsTrue(hasRegisteredHandlers );
}
Tips:
:idea: The name of the test method has more meaning
:idea: Use [VerifyMocks] to make sure that the mocks are reset even if the test fails
:idea: Do all the setting up in the beginning and verify at the end to highlight the state being verified