Events - hypersolutions/hypermock GitHub Wiki

Raising events on mocks

There is some limited support for events in HyperMock. Given an interface exposes an event and a class registers a handler against it, HyperMock allows raising of those events to test the handlers attached:

public interface IThermostatService
{
    event EventHandler<TempChangedEventArgs> TempChanged;

    void ChangeTemp(int temp);
}

public class TempChangedEventArgs : EventArgs
{
    public TempChangedEventArgs(int temp)
    {
        Value = temp;
    }

    public int Value { get; }
}

And the controller:

public class ThemostatController
{
    private readonly IThermostatService _thermostatService;

    public ThemostatController(IThermostatService thermostatService)
    {
        _thermostatService = thermostatService;
        _thermostatService.TempChanged += OnTempChanged;
    }

    private void OnTempChanged(object sender, TempChangedEventArgs args)
    {
        _thermostatService.ChangeTemp(args.Value);
    }
}

Then to test that the ChangeTemp method is called:

[Test]
public void RaiseInvokesAddHandlerWithParams()
{
    const int temp = 100;
    var mockService = Mock.Create<IThermostatService>();
    var controller = new ThermostatController(mockService.Object);

    mockService.Raise(s => s.TempChanged += null, new TempChangedEventArgs(temp));

    mockService.Verify(p => p.ChangeTemp(temp), Occurred.Once());
}