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