EF Core регистрирует SQL-запросы при модульном тестировании

Я запускаю несколько модульных тестов (NUnit) на своем DbContext (к базе данных Oracle) в EF Core 2.2, и я хотел бы увидеть запросы 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 для прямого вывода результата теста или какой-то магии, о которой я не знаю.

Любая помощь приветствуется.


person Scott Baker    schedule 23.08.2019    source источник


Ответы (2)


TestContext.WriteLine от NUnit — это то, что вам нужно:

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

Изменить:

Чтобы получить сгенерированный SQL:

Ядро EF: Получить код SQL из запроса EF Core< /а>

EF 6: Как мне просмотреть SQL, сгенерированный Entity Framework?

person Old Fox    schedule 23.08.2019
comment
Это половина половины вопроса - где я могу получить оператор SQL, который использовался? - person Scott Baker; 24.08.2019

здесь есть ответ, в котором показано, как регистрировать SQL-запросы EF Core с использованием пакета Microsoft.Extensions.Logging.Console...

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)});

Дополнительная информация здесь

person Aleks    schedule 24.08.2019