单元测试中的模拟日志单例

我有一个记录器类,其目的是从我的解决方案中的任何类中调用,该类决定记录某些内容。我添加了一个接口,这就是为什么我应用了单例模式,并且没有使用静态类。


我的 LogManager 实现(单例):https : //pastebin.com/NHKmbj9c


我想编写简单的单元测试,它应该使用局部变量,测试每个 ILogger 方法的功能,但是一旦我的第一个单元通过,单例将在上下文中保持初始化状态,使后续单元测试失败(而他们正在尝试初始化单身人士......)。


单元测试:


[TestClass]

public class LogManagerTests

{

    [TestMethod]

    public void Error_ExpectedErrorLevel_ShouldBe_Error()

    {

        // Arrange

        var actualLevel = ErrorLevel.Warning;

        const ErrorLevel expectedLevel = ErrorLevel.Error;

        var iLogger = LogManager.GetInstance;

        iLogger.Initialize((level, msg) => { actualLevel = level; }, null);


        // Act

        iLogger.Error(new Exception(), string.Empty);


        // Assert

        Assert.AreEqual(expectedLevel, actualLevel);

    }


    [TestMethod]

    public void Debug_ExpectedErrorLevel_ShouldBe_Verbose()

    {

        // Arrange

        var actualLevel = ErrorLevel.Warning;

        const ErrorLevel expectedLevel = ErrorLevel.Verbose;

        var iLogger = LogManager.GetInstance;

        iLogger.Initialize(null, (level, msg, ex) => { actualLevel = level; });


        // Act

        iLogger.Debug(string.Empty);


        // Assert

        Assert.AreEqual(expectedLevel, actualLevel);

    }

}

另一个技巧是将 LogManager 初始化为我的 TestClass 中的私有全局变量,但是如果单元测试异步运行,这可能会产生竞争条件,因为多个方法将访问相同的输出变量,这些变量可能会相互覆盖。


是否可以以任何方式对单身人士进行 UnitTest?


该设计不允许我重构 LogManager,并从中删除单例模式。


守候你守候我
浏览 131回答 1
1回答

精慕HU

可以对单例进行单元测试,您只需要换个角度思考即可。不要那么努力地改变你的方法来适应测试。考虑创建一个仅用于测试的方法,LogManager.Uninitialize(). 在这组测试中的每个测试之后调用它以确保您的单例设置回可测试状态。[TestCleanup()]public void Cleanup(){     LogManager.Uninitialize();}它可能不纯粹,但我认为每隔一段时间编写一次诊断方法就可以了。在需要良好测试覆盖率的情况下,这比拥有糟糕的测试覆盖率要好。
打开App,查看更多内容
随时随地看视频慕课网APP