2

Я работаю над проектом, созданным на Boilerplate Asp.Net, и теперь мне нужно выполнить единый тест сервисов, используя реальные репозитории с реальным подключением к базе данных (без насмешек) , Я использовал последний пост BringerOd в https://gist.github.com/hikalkan/1e5d0f0142484da994e0 в качестве руководства для настройки экземпляра UnitOfWorkScope. Таким образом, мой код в настоящее время выглядит следующим образом:Получение нового DbContext при модульном тестировании с помощью Boilerplate Asp.Net

IDisposableDependencyObjectWrapper<IUnitOfWork> _unitOfWork; 

[TestInitialize] 
public void SetUpService() 
{ 
    //initialize service 

    _unitOfWork = IocManager.Instance.ResolveAsDisposable<IUnitOfWork>(); 
    UnitOfWorkScope.Current = _unitOfWork.Object; 
    UnitOfWorkScope.Current.Initialize(true); 
    UnitOfWorkScope.Current.Begin(); 

} 

[TestCleanup] 
public void CleanUpService() 
{ 
    UnitOfWorkScope.Current.Cancel(); 
    _unitOfWork.Dispose(); 
    UnitOfWorkScope.Current = null; 
} 

Это работает как шарм для первого модульного тестирования, но когда я пытаюсь сделать вызов хранилища во втором тесте, я получаю: «Операция не может быть завершено, потому что DbContext был удален ».

Мое предположение заключается в том, что при повторном запуске метода TestInitialize единица рабочей области присваивается тем же (расположенным) DbContext, а не новым. Я полагаю, что в моих реальных методах тестирования я мог бы настроить свой UnitOfWorkScope внутри используемого блока с помощью IUnitOfWork. Тем не менее, я действительно не хочу повторять эту логику внутри каждого теста. Кто-нибудь знает, как вручную получить эффект от использования блока, чтобы каждый раз получать новый DbContext?

ответ

1

Проверил: http://aspnetboilerplate.com/Pages/Documents/Repositories

Вы должны пометить метод вызова с [UnitOfWork] атрибута.

Причина этого, как объяснено в связанном документе

При вызове GetAll() метода репозитория, должно быть открыто соединение с базой данных. Это связано с отсроченным исполнением IQueryable<T>. Он не выполняет запрос базы данных, если вы не вызвали метод ToList() или не использовали IQueryable<T> в цикле foreach (или каким-либо образом доступ к запрошенным элементам). Поэтому, когда вы вызываете метод ToList(), соединение с базой данных должно быть живым. Это может быть достигнуто путем маркировки метода вызывающего абонента с помощью атрибута [UnitOfWork]ASP.NET Boilerplate. Обратите внимание, что методы Application Service уже используют [UnitOfWork] по умолчанию, поэтому GetAll() будет работать без добавления атрибута [UnitOfWork] для методов обслуживания приложений.

+0

@ StephenByrne: Насколько я могу судить, это * является неотъемлемой частью ответа (по крайней мере, по плакату): «Вы должны отметить метод вызова атрибутом [UnitOfWork]». –

+0

@NathanTuggy - вредители, у меня плохая ночь, это была ошибка с моей стороны, закрытое голосование удалено. –

+0

@StephenByrne: Я вижу более тонкие неправильные суждения только по ссылкам, чем что-либо еще в обзоре. Конечно, это сложно понять. –