正确的方法来模拟多线程环境的Dbcontext

时间:2018-06-08 04:00:50

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

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

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

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

我在线查看,但没有找到一个好的解决方案。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

要对此进行单元测试,我会为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():