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



我有一个.net核心2.2应用程序,它使用SQL数据库。我已经使用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,然后在OnConfiguring的重写中将其传递给UseLoggerFactory确实有效。

这是.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,情况可能会有所不同(谁知道它的容器中到底设置了什么(,但当构建一个了解内存提供程序使用的最小系统时,我想避免这种情况(。

最新更新