Mock Log Singleton в модульном тесте - PullRequest
0 голосов
/ 22 мая 2018

У меня есть класс логгера, цель которого вызываться из любого класса в моем решении, который решает что-то записать.Я добавил интерфейс, поэтому я применил шаблон синглтона и не использовал статический класс.

Моя реализация LogManager (синглтон): https://pastebin.com/NHKmbj9c

Я хотел написать простоймодульные тесты, в которых предполагается использовать локальные переменные, тестирование функциональности каждого из методов ILogger, но как только мой первый модуль пройдет, Singleton останется инициализированным в контексте, что приведет к сбою последующих модульных тестов (пока они пытаются инициализироватьсинглтон ...).

Модульный тест:

[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 и удалить из него шаблон синглтона.

1 Ответ

0 голосов
/ 22 мая 2018

Возможно провести модульное тестирование синглтона, вам просто нужно подумать об этом по-другому.Не пытайтесь изменить свою методологию так, чтобы она соответствовала требованиям теста.Подумайте о создании метода, который используется только для тестирования, LogManager.Uninitialize().Вызывайте это после каждого теста в этой группе тестов, чтобы убедиться, что ваш синглтон возвращается в тестируемое состояние.

[TestCleanup()]
public void Cleanup()
{
     LogManager.Uninitialize();
}

Это может быть не чисто, но я думаю, что это нормально, писать время от времени в методе диагностики.Это лучше, чем плохое тестовое покрытие, где вам нужно хорошее тестовое покрытие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...