如何将 Serilog 添加到单元测试的服务集合中

k.c*_*.c. 1 c# mstest serilog .net-core

在我们的 .Net Core 3.1 项目中,我们使用 Serilog 进行日志记录

在我的测试设置中,我创建了一个 ServiceCollection,以便我可以使用服务集合 \ - 提供程序来更新我在测试中使用的类。我有一个同时使用 DbContext 和 Serilog 记录器的存储库。

using Serilog;
using Microsoft.EntityFrameworkCore;

namespace MyApp.Persistency
{
    public class MyRepository : IMyRepository

{
    private readonly DataContext _dataContext;
    private readonly ILogger _logger;

    public OpvragenOnbekendeBurgerRegistratieRepository(DataContext dataContext, ILogger logger)
    {
        _dataContext = dataContext;
        _logger = logger;
    }
...
}
Run Code Online (Sandbox Code Playgroud)

在我的测试课中:

    [TestInitialize]
    public void Initialize()
    {
         var diCollection =
         new ServiceCollection()
             .AddSingleton(new SqlConnectionOption(_connectionstring))
             .AddDbContext<DataContext>(
                options =>
                {
                   options.UseSqlServer(_connectionstring);
                }
              )
              ...               
              xxx Add some kind of Serilog registration xxx
              ...
              .AddTransient<IMyRepositoy,MyRepository>();
           _di = diCollection.BuildServiceProvider;
      }

    [TestMethod]
    public void MyRepositoryTest()
    {  
        // arrange
        var myRepository = _di.GetRequiredService<IMyRepository>();
        ...
    }
Run Code Online (Sandbox Code Playgroud)

我见过无数不同的代码示例,但似乎没有一个只适用于容器,而不是完整的主机。不记录任何内容的虚拟对象是可以接受的,但记录到测试控制台当然是史诗般的。

L.V*_*let 9

将 Serilog 添加到ServiceCollection实例:

new ServiceCollection()
    //...
    .AddLogging(builder => builder.AddSerilog(dispose: true))
    //...
Run Code Online (Sandbox Code Playgroud)

串行日志配置:

Log.Logger = new LoggerConfiguration()
    //...
    .CreateLogger();
Run Code Online (Sandbox Code Playgroud)

文档