Thomas Tran
Thomas Tran

Reputation: 77

Unit Test Event Handler

I got this event handle and how can I do unit test for this

public class MyLearningEvent
{
    private event EventHandler _Closed;

    public event EventHandler Closed
    {
        add
        {
            _Closed -= value;
            _Closed += value;
        }
        remove
        {
            _Closed -= value;
        }
    }

    public void OnClosed()
    {
        if (_Closed != null) _Closed(this, EventArgs.Empty);
    }
}

Just modified code so that much clear

Thanks

Upvotes: 0

Views: 3623

Answers (2)

jgauffin
jgauffin

Reputation: 101192

You should not unit test that code. It's a feature which is built into .NET. Your event handling is flawed imho.

add
{
    _Closed -= value;
    _Closed += value;
}

Probably means that your invokers don't keep track on if they have subscribed or not. That can lead to memory leaks: http://blog.naviso.fr/wordpress/wp-content/uploads/2011/11/MemoryLeaks-English.jpg

A more robust (and thread safe implementation) is:

public class MyLearningEvent
{
    public event EventHandler Closed = delegate {};

    public void TriggerClosed()
    {
        Closed(this, EventArgs.Empty);
    }
}

But you should not let anyone else trigger that event (make the TriggerClosed private/protected)

Upvotes: 3

Hand-E-Food
Hand-E-Food

Reputation: 12814

Try this method. This assumes MyClass.Close() raises the MyClass.Closed event.

public void ClosedEventHandlerIsNotCalledAfterBeingRemoved()
{
    MyLearningEvent Target = new MyLearningEvent();
    EventHandler Target_Closed = new EventHandler((sender, e) => { Assert.Fail("Closed EventHandler was raised after being removed."); });
    Target.Closed += Target_Closed;
    Target.Closed -= Target_Closed;
    Target.OnClosed();
}

Upvotes: 0

Related Questions