简体   繁体   English

单元测试事件处理程序

[英]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 谢谢

You should not unit test that code. 您不应该对该代码进行单元测试。 It's a feature which is built into .NET. 这是.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 这可能导致内存泄漏: 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) 但是您不应该让其他任何人触发该事件(将TriggerClosed私有/受保护)

Try this method. 试试这个方法。 This assumes MyClass.Close() raises the MyClass.Closed event. 假定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();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM