Как подавить 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 в поставщике службы приложений.
Как мне подавить эту ошибку?
Ответы
Ответ 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));
});