单元测试 - 引发静态事件以测试正确的事件处理程序分配

时间:2014-03-10 18:54:30

标签: c# unit-testing events static

我有一个静态事件的类。

public class EventOrigin {
    public static event handler eventOccurred;
    public delegate void handler(string arg1, string arg2);
}

我有一个不同的类可以挂钩这些事件。我想测试一下这些事件是否已正确挂钩。

public static class ConsumesEvent {
    public static register(){
        EventOrigin.eventOccurred += eventOrigin_eventOccurredHandler;
    }

    public static void eventOrigin_eventOccurredHandler(string arg1, string arg2){
        //some stuff happens here
    }
}

我需要测试的是,特别是EventOrigin.eventOccurredConsumesEvent.register()之后触发了相应的处理程序。这似乎意味着我必须在我的测试中提出EventOrigin.eventOccurred事件。

我猜也许可以使用反思。是否有一种特殊的模式可以使我更容易并且在单元测试中不需要反射?

2 个答案:

答案 0 :(得分:1)

使用隔离框架进行单元测试会使事情变得更容易。

您可以使用Microsoft Fakes Framework编写接口和抽象类的自定义存根实现。

甚至可以拦截和绕过任何.NET代码和其他依赖项(例如,SharePoint,第三方程序集等)。

以下街区帖子包含一些演示使用DispatcherTimer假冒的示例:

http://www.peterprovost.org/blog/2012/04/25/visual-studio-11-fakes-part-2/

答案 1 :(得分:1)

我决定自己不需要自己提出这个事件。相反,我可以使用私有方法来引发事件,然后使用PrivateType来调用该方法。

public class EventOrigin {
    public static event handler eventOccurred;
    public delegate void handler(string arg1, string arg2);

    #region testability seams

    private static raiseEventOccurred(string arg1, string arg2) {
        if(eventOccurred != null)
            eventOccurred(arg1, arg2);
    }

    #endregion
}

后来在这样的测试中消耗了它:

private void whenEventRaised_someStuffHappens(){
    PrivateType eventOriginType = new PrivateType(typeof(EventOrigin));
    eventOriginType.InvokeStatic("raiseEventOccurred", "arg1", "arg2");

    Assert.IsTrue(overthinkingTheProblemIsDangerous);
}

一个很好的副作用是围绕引发事件的代码从实际工作发生的直接区域中获取空检查,从引发这些方法的区域中消除一些噪声。