单元测试 - 如何测试仅插入日志消息的 `void` 方法 (Serilog)

Igo*_*gor 5 c# logging unit-testing void serilog

我需要测试一个 type 的方法void,它只是使用 LOG 框架(Serilog)在我的 LOG 变量上插入一条消息。

见实现示例:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们需要为 LogInit (...)

这个方法真的需要测试吗?或者更确切地说,它的存在有意义吗?

我在读一些关于:

“如果你的方法没有副作用,也没有返回任何东西,那么它就没有做任何事情。”

在这种情况下,该方法只是“单独”创建以维护代码的组织并进一步分离类的职责。

那讲得通?

编辑: @PeterBons

我们无权访问在接口 ( logger) 中注册的消息,例如:this.logger.GiveMeWarningLogs()...

git*_*box 7

如果您使用的是 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}");
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 -1

您的方法不会返回任何内容,因此很难确定是否可以进行测试。现在,您的方法所做的唯一一件事就是为 Serilog 库准备记录的对象。如果您有更复杂的逻辑来创建该对象,您可以将其提取到它自己的方法中并让它返回该日志对象,那么测试它会很容易。您创建的方法的好处是它创建了一个额外的层,因此如果您决定更改日志记录库,您只需在一个地方进行即可。