2012-03-21 108 views
0

我得到这个事件处理,我该怎么办这个单元测试事件处理程序

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

刚刚修改的代码,以便清楚得多

感谢

+0

这就是C#。请参阅http://msdn.microsoft.com/en-us/library/8627sbea(v=vs.71).aspx,示例3, – 2012-03-21 04:35:24

+0

是的,我知道,但我是新的事件处理程序,我不知道如何执行删除部分中的代码,例如如何编写代码,以便在调试期间gopp去除{_Closed - = value} – 2012-03-21 04:41:20

回答

0

试试这个方法的单元测试。这假定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(); 
} 
+0

我修改了代码,使其更清晰。实际上,我喜欢有一个单元测试,它涵盖了每次我尝试使用NCover运行代码时发生的事件处理程序Closed,代码永远不会进入删除部分,例如删除 { _Closed - = value; } – 2012-03-21 05:19:00

+0

我复制并粘贴你的类到我的代码中,并在'Closed remove'中放置一个断点。在测试方法后触发的断点称为“Target.Closed - = Target_Closed;'。正在运行“已关闭的删除”代码。 – 2012-03-21 05:29:17

2

您不应该单元测试该代码。这是一个内置于.NET中的功能。你的事件处理是有缺陷的。

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

可能意味着您的invokers不跟踪他们是否已订阅或未订阅。这可能会导致内存泄漏: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私有/保护)