Обработчик событий модульного теста - PullRequest
0 голосов
/ 21 марта 2012

Я получил этот дескриптор события и как я могу выполнить модульное тестирование для этого

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);
    }
}

Только что модифицированный код, чтобы он был максимально понятным

Спасибо

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Вы не должны тестировать этот код. Эта функция встроена в .NET. Ваша обработка событий имеет недостатки imho.

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

Возможно, это означает, что ваши инициаторы не отслеживают, подписаны они или нет. Это может привести к утечке памяти: http://blog.naviso.fr/wordpress/wp-content/uploads/2011/11/MemoryLeaks-English.jpg

Более надежная (и многопоточная реализация):

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

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

Но вы не должны позволять кому-либо еще вызывать это событие (сделать TriggerClosed закрытым / защищенным)

0 голосов
/ 21 марта 2012

Попробуйте этот метод.Это предполагает, что MyClass.Close() вызывает событие MyClass.Closed.

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();
}
...