Правильный способ макета Dbcontext для многопоточной среды - PullRequest
0 голосов
/ 08 июня 2018

В платформе сущностей DBContext не является поточно-безопасным .Для поддержки многопоточной среды мне приходилось инициализировать новый DbContext на основе строки подключения каждый раз, когда требуется связь с SQL.

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

Теперь юнит-тест становится сложным.Поскольку DbContext скрыт в коде, я не могу передать поддельный DbContext.

Я посмотрел онлайн, но не нашел хорошего решения.Есть предложения?

1 Ответ

0 голосов
/ 08 июня 2018

Для модульного тестирования я создал бы фабрику для DbContext и получил бы ввод в систему.Теперь фабрика может быть заменена на NSubstitute .Для части модульных тестов замещенная фабрика DbContext вернет новый DbContext с подключением к базе данных памяти, такой как Усилие для 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():
...