单元测试依赖关系具有静态配置方法C#

时间:2013-04-02 03:19:52

标签: .net unit-testing static log4net

我有一个继承了简单日志记录界面的类。此接口的一个实现使用log4net。

Log4net有一个静态配置方法,在使用XML配置时需要调用该方法。该行是:

log4net.Config.XmlConfigurator.Configure();

文档通常声明将其置于全局事件中,但我希望将所有log4net代码封装到这一个类中。所以我只是使用静态变量来跟踪是否已经配置了log4net,如果没有,我会调用这个方法:

//This is static as I only ever want one instance
private static log4net.ILog _logger;
private static bool _isConfigured;

public Log4NetLogger() {
    if(!_isConfigured) {
        //This is needed to initialise the Log4Net logger
        log4net.Config.XmlConfigurator.Configure();
        _isConfigured = true;
        _logger = log4net.LogManager.GetLogger(_defaultLogger);
    }
}

问题是我不知道如何测试这个。我希望能够测试Configure()方法只被调用一次。静态变量和静态方法结合逻辑构成器的一部分使得这很棘手。

感觉这是我的代码很糟糕,有没有办法可以编写这段代码,以便配置调用只调用一次,然后,我该如何测试呢?

1 个答案:

答案 0 :(得分:0)

可以使用C#“Static Constructor”来实现您的目标。

//This is static as I only ever want one instance
private static log4net.ILog _logger;

static Log4NetLogger() {
    //This is needed to initialise the Log4Net logger
    log4net.Config.XmlConfigurator.Configure();
    _logger = log4net.LogManager.GetLogger(_defaultLogger);
}

根据规范,它最多运行一次(每个App Domain),您不需要测试它。但是,您必须更仔细地处理异常,因为静态构造函数中的错误更难理解。