Подтвердить что ты не робот

Как подавить InMemoryEventId.TransactionIgnoredWarning при модульном тестировании с помощью базы данных в памяти с транзакциями?

Я использую базу данных EF Core в памяти и пытаюсь запустить unit тест для метода, который использует транзакции:

    using (var transaction = await _context.Database.BeginTransactionAsync())
    {
        _context.Update(item);
        result = await _context.SaveChangesAsync();

        // some other stuff

        transaction.Commit();
    }

Тем не менее, я получаю эту ошибку от тестового бегуна:

System.InvalidOperationException: Предупреждение как исключение ошибки для предупреждения "InMemoryEventId.TransactionIgnoredWarning": транзакции не поддерживаются хранилищем в памяти. См http://go.microsoft.com/fwlink/?LinkId=800142 Чтобы подавить это исключение использовать DbContextOptionsBuilder.ConfigureWarnings API. ConfigureWarnings можно использовать при переопределении метода DbContext.OnConfiguring или при использовании AddDbContext в поставщике службы приложений.

Как мне подавить эту ошибку?

4b9b3361

Ответ 1

В коде, где вы объявляете базу данных в памяти, сконфигурируйте контекст, чтобы игнорировать эту ошибку следующим образом:

    public MyDbContext GetContextWithInMemoryDb()
    {
        var options = new DbContextOptionsBuilder<MyDbContext>()
            .UseInMemoryDatabase(Guid.NewGuid().ToString())
            // don't raise the error warning us that the in memory db doesn't support transactions
            .ConfigureWarnings(x => x.Ignore(InMemoryEventId.TransactionIgnoredWarning))
            .Options;

        return new MyDbContext(options); 
    }

Ответ 2

Я использовал ответ от @tomRedox, но менял его для использования в файле startup.cs для ASP.NET Core 2.0.

services.AddDbContext<MyDbContext>(options =>
                {
                options.UseInMemoryDatabase("TestDb");
                options.ConfigureWarnings(x => x.Ignore(InMemoryEventId.TransactionIgnoredWarning));
                });