xunit - 使用 EF Core In Memory 提供程序时无法在单元测试期间获取 EF Core 日志

标签 xunit ef-core-2.2

我有一个使用 SQL 数据库的 .net core 2.2 应用程序。我已经使用 EF Core In Memory 提供程序编写了一些单元测试来测试我的数据访问代码。我想生成 SQL 日志(基本上想知道生成的 SQL 语句。我引用了这篇文章 https://learn.microsoft.com/en-us/archive/msdn-magazine/2018/october/data-points-logging-sql-and-change-tracking-events-in-ef-core,但它不起作用(看不到任何日志)。最后我结束了类似

public class TestFixture: IDisposable
    {
        private static readonly LoggerFactory _loggerFactory
           = new LoggerFactory(new[] {
            new DebugLoggerProvider((category, level) =>
                level == LogLevel.Debug)
            //new ConsoleLoggerProvider ((category, level) =>
            //    category == DbLoggerCategory.Database.Command.Name &&
            //    level == LogLevel.Debug, true)
        });

        #region Constructor(s)
        public TestFixture()
        {

        }
        #endregion

        #region Public Method(s)

        public MyDbContext CreateMyDbContext()
        {
            var options = new
               DbContextOptionsBuilder<MyDbContext>().UseInMemoryDatabase(
               "MyDb")
               .UseLoggerFactory(_loggerFactory)
               .EnableSensitiveDataLogging()
               .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking).Options;
            return new MyDbContext(options);
        }
        #endregion

现在我在 VS 输出窗口中收到大量日志,这没有帮助。看起来它们是 EF Core 内部日志,但能够识别生成的 SQL 语句。有谁知道如何在使用 EF Core In Memory 提供程序时在单元/集成测试场景中获取 EF Core 日志?

最佳答案

我刚刚开始工作。仅将我的 DbContext 派生类型和 ILoggerFactory 放在同一个 DI 容器中是不够的。但是明确地让我的上下文类型依赖于 ILoggerFactory,然后将其传递给 UseLoggerFactory 覆盖 OnConfiguring 确实有效。

这是 .NET 6 和 EF Core 6。

public class InMemoryBasicModelContext : BasicModelContext {
    private readonly ILoggerFactory lf;

    public InMemoryBasicModelContext(ILoggerFactory lf)
        => this.lf = lf;

    protected override void OnConfiguring(DbContextOptionsBuilder builder)
        => builder.UseInMemoryDatabase("TestInMemory")
                  .ConfigureWarnings(b => b.Ignore(InMemoryEventId.TransactionIgnoredWarning))
                  .EnableSensitiveDataLogging()
                  .UseLoggerFactory(lf);
}

我怀疑如果我使用的是 GenericHost 事情可能会有所不同(谁知道它的容器中到底设置了什么),但是在构建一个最小系统以了解 In Memory Provider 的使用时我想避免这种情况)。

关于xunit - 使用 EF Core In Memory 提供程序时无法在单元测试期间获取 EF Core 日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60706924/

相关文章:

.net - Resharper 未运行 xUnit 测试

entity-framework-core - 让 EF Core 将 SQL 语句输出到 xUnit 的 ITestOutputHelper

entity-framework-migrations - EF Core 反复创建相同的迁移,更改标识列并且不做任何更改

sql-server - 捕获删除临时表中行的用户

unit-testing - 将 Generic.List 转换为 System.Threading.Task.Generic.List 时出现问题

java - 相当于 C# 中的 Java 元注释

c# - 使用 Xunit 进行 .Net 核心测试

visual-studio - xUnit 测试不会出现在 tfs 上

c# - 用于检查数据库中是否存在实体的 FluentValidator 扩展方法