Получение нового DbContext при модульном тестировании с помощью Asp.Net Boilerplate

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

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?


person Mr. Davis    schedule 18.12.2014    source источник


Ответы (1)


Проверьте: http://aspnetboilerplate.com/Pages/Documents/Repositories

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

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

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

person William Obando    schedule 15.05.2015