Создание DbContext внутри метода, который вы хотите протестировать, ничем не отличается от создания любого другого конкретного экземпляра зависимости в коде, это означает, что вы не можете тестировать с помощью симулированной зависимости.Поэтому на ум приходят следующие варианты (без изменений кода / структуры):
- Реализация провайдера данных в памяти, чтобы указать EF для модульных тестов.
- Настройкабаза данных с известным состоянием, которую можно восстановить между тестовыми прогонами.(Это скорее интеграционный тест, не очень подходящий для TDD, где вам нужны тесты, которые могут выполняться очень быстро, очень часто.)
- Поместите его в корзину "не предназначено для модульного тестирования" из-за отсутствияDI / IoC
Насмешка над DbContext - это грязно, но выполнимо.После того, как у вас будет один макет, я бы порекомендовал добавить в проект контейнер IoC, такой как Autofac.Я не знаю обстоятельств, которые помешали бы вам внедрить контейнер IoC, но если команда беспокоится о том, что это ре-фактор «все или ничего» и слишком большая работа, то я бы заверила их, что этомогут быть добавлены с минимальными изменениями в проект и таким образом, чтобы не нарушать существующий код.Помимо DbContext, если код не использует DI / IoC Container, как вы планируете обрабатывать другие конкретные зависимости?Вам не нужно переключать все зависимости / контроллеры за один раз, но улучшать их постепенно.
Как только контейнер настроен для разрешения контроллеров MVC, существующие контроллеры с конструкторами по умолчанию будутне быть затронутым.Затем вы можете зарегистрировать свой DbContext в контейнере и настроить тестируемый контроллер так, чтобы он принимал контекст в конструкторе.Контейнер IoC, например, настроил бы область действия DbContext на Instance per Request, поэтому вам не нужен блок using {}
.Оттуда ваши тесты могут предоставить поддельный DbContext, в то время как контейнер управляет временем жизни контекста.
Что касается создания дружественных для модульных тестов контроллеров / кода с контейнером IoC, я недавно опубликовал статью об использовании Lazy зависимостей / w Autofac, чтобы сделать написание тестов для классов с несколькими зависимостями проще простого.Вы можете прочитать на https://medium.com/@StevePy/writing-easily-testable-code-with-autofac-lazy-properties-f9c63457c8ce