单元测试时 EF Core 日志记录 SQL 查询

EF Core Logging SQL Queries when Unit Testing

我在 EF Core 2.2 中对我的 DbContext(到 Oracle 数据库)进行了一些单元测试 (NUnit),我想查看 SQL 查询它正在为每个单元测试构建,最好是

我的单元测试类似于:

[SetUp]
public void Setup()
{
    var options = new DbContextOptionsBuilder<MyContext>()
        .UseOracle("some connection string")
        .Options;

    _context = new MyContext(options);
}
[Test]
public void We_can_count_all_the_things()
{
    var count = _context.Things.Count();

    Assert.That(count, Is.GreaterThan(0));

    // something like this for Test output:
    Assert.Pass($"SQL QUERY:{???}")
}

...或者也许我可以使用 ILogger 将输出定向到测试结果或我不知道的一些魔法。

感谢任何帮助。

NUnitTestContext.WriteLine就是你要找的:

...
TestContext.WriteLine($"SQL QUERY:{???}");

编辑:

得到生成的SQL:

EF 核心: Get SQL code from an EF Core query

EF 6:How do I view the SQL generated by the Entity Framework?

有一个答案 显示了如何使用 Microsoft.Extensions.Logging.Console 包记录 EF Core SQL 查询...

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    => optionsBuilder
        .UseLoggerFactory(MyLoggerFactory) // Warning: Do not create a new ILoggerFactory instance each time
        .UseSqlServer(
            @"Server=(localdb)\mssqllocaldb;Database=EFLogging;Trusted_Connection=True;ConnectRetryCount=0");

像这样:-

public static readonly LoggerFactory MyLoggerFactory
    = new LoggerFactory(new[] {new ConsoleLoggerProvider((_, __) => true, true)});

更多信息here