使用带有事务的内存数据库进行单元测试时,如何抑制 InMemoryEventId.TransactionIgnoredWarning?

Posted

技术标签:

【中文标题】使用带有事务的内存数据库进行单元测试时,如何抑制 InMemoryEventId.TransactionIgnoredWarning?【英文标题】:How to suppress InMemoryEventId.TransactionIgnoredWarning when unit testing with in-memory database with transactions? 【发布时间】:2017-10-20 05:09:06 【问题描述】:

我正在使用 EF Core 内存数据库,并且正在尝试对使用事务的方法运行单元测试:

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

【讨论】:

你拯救了我的一天,我的 ResilientTransaction 在单元测试中失败了。添加这个已经解决了一切。非常感谢。【参考方案2】:

我使用了来自 @tomRedox 的答案,但在 ASP.NET Core 2.0 startup.cs 文件中使用了它。

services.AddDbContext<MyDbContext>(options =>

    options.UseInMemoryDatabase("TestDb");
    options.ConfigureWarnings(x => x.Ignore(InMemoryEventId.TransactionIgnoredWarning));
);

【讨论】:

以上是关于使用带有事务的内存数据库进行单元测试时,如何抑制 InMemoryEventId.TransactionIgnoredWarning?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySql 中对事务提交超时进行单元测试?

Python如何抑制单元测试的tkinter mainloop()

Nunit中如何进行事务性单元测试

执行单元测试时如何防止dbunit生成database.script文件

SpringMVC中单元测试中事务的使用

SpringMVC中单元测试中事务的使用