Модульный тест - Как проверить метод `void`, который просто вставляет сообщение журнала (Serilog) - PullRequest
0 голосов
/ 20 октября 2018

Мне нужно протестировать метод типа void, он просто вставляет сообщение в мою переменную LOG с использованием каркаса LOG ( Serilog ).

См. Пример реализации:

public class MyClass
{
    public MyClass(ILogger<IProcess> logger)
    {
        this.logger = logger;
    }

    private readonly ILogger logger;

    //...Anothers methods...

    public void LogInit(Guid processId, string folder, string[] args)
    {
        var myObject = new
        {
            ProcessId = processId,
            Folder = folder,
            Arguments = args
        };

        this.logger.LogWarning("{@myObject}", myObject);
    }
}

В этом сценарии нам необходимо создать тест для LogInit (...)

Нужно ли тестировать этот метод?Или, скорее, имеет ли смысл его существование?

Я читал кое-что о:

«Если ваш метод не имеет побочных эффектов и ничего не возвращает, тогдаон ничего не делает. "

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

Это имеет смысл?

РЕДАКТИРОВАТЬ: @ PeterBons

У нас нет доступа к сообщениям, зарегистрированным в интерфейсе (logger), например: this.logger.GiveMeWarningLogs()...

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

Вы должны смоделировать свой регистратор и проверить, был ли вызван метод LogWarning.Вы можете использовать Moq для этого.Также, если вы хотите протестировать LogInit, вам нужно сделать это общедоступным или внутренним с определением [InternalVisibleTo ('someTestProjName')]]

Метод теста будет выглядеть так (xUnit):

public void ShouldCallLogWarning()
{
    var loggerMock = new Mock<ILogger>();
    loggerMock.Setup(_ => _.LogWarning(It.IsAny<string>(), It.IsAny<object>(), null);        

    var myClass = new MyClass(loggerMock.Object);

    //
    myClass.LogInit(Guid.NewGuid(), "folderPath", null)

    //
    _loggerMock.Verify(_ => _.LogWarning(It.IsAny<string>(), It.IsAny<string>(), null), Times.Once());
}
0 голосов
/ 04 августа 2019

Если вы используете Serilog, вы можете использовать Test Correlator Sink , чтобы увидеть, какие события журнала генерирует вызов метода.

[TestMethod]
public void A_test()
{
    var myClass = new MyClass(new LoggerConfiguration().WriteTo.TestCorrelator().CreateLogger());

    using (TestCorrelator.CreateContext())
    {
        myClass.LogInit();

        TestCorrelator.GetLogEventsFromCurrentContext()
            .Should().ContainSingle()
            .Which.MessageTemplate.Text
            .Should().Be("{@myObject}");
    }
}
0 голосов
/ 20 октября 2018

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

...