【问题标题】:Proper way to mock Dbcontext for multi-thread environment为多线程环境模拟 Dbcontext 的正确方法
【发布时间】:2018-06-08 04:00:50
【问题描述】:

在实体框架中,DBContext 不是 thread-safe。为了支持多线程环境,每次需要与 SQL 通信时,我都必须根据连接字符串初始化一个新的 DbContext。

private void function(string sqlConnectionString)
{
    using (var dbContext = new DbContext(sqlConnectionString))
    {
        // talk to sql here
    }
}

现在单元测试变得棘手了。由于 DbContext 隐藏在代码中,因此我无法传入模拟的 DbContext。

我上网查了一下,没有找到好的解决办法。有什么建议吗?

【问题讨论】:

  • 您使用的是哪个 IoC 框架?

标签: c# .net entity-framework entity-framework-6


【解决方案1】:

要对此进行单元测试,我将为DbContext 创建一个工厂并注入该工厂。现在可以用NSubstitute 替换工厂。对于单元测试部分,替换的DbContext 工厂将返回一个新的DbContext,并连接到内存数据库,例如Effort for Entity Framework

private void function(IDbContextFactory dbContextFactory)
{
    using (var dbContext = dbContextFactory.Create())
    {
        // talk to sql here
    }
}

在你的单元测试代码中:

//Arrange
var connectionStringForEffortDatabase = ...
var dbCotextFactory = Substitute.For<IDbContextFactory>();
dbContextFactory.Create().Returns(new DbContext(connectionStringForEffortDatabase));

//Act
function(dbContextFactory);

//Assert
Assert.Something():

【讨论】:

    猜你喜欢
    • 2018-08-12
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 2018-12-08
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多