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()
...
如果您使用的是 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 库准备记录的对象。如果您有更复杂的逻辑来创建该对象,您可以将其提取到它自己的方法中并让它返回该日志对象,那么测试它会很容易。您创建的方法的好处是它创建了一个额外的层,因此如果您决定更改日志记录库,您只需在一个地方进行即可。