В моем приложении у меня есть несколько небольших dbcontexts фреймворка сущности, которые используют одну и ту же базу данных, например:
public class Context1 : DbContext {
public Context1()
: base("DemoDb") {
}
}
public class Context2 : DbContext {
public Context2()
: base("DemoDb") {
}
}
Все обновления базы данных выполняются с помощью сценариев и не зависят от миграции (и они не будут продвигаться вперед). Вопрос в том, как бы вы проводили тестирование интеграции с этими контекстами?
Я считаю, что здесь есть три варианта (может быть, больше я их не знаю)
Вариант 1 - Суперконтекст - контекст, который содержит все модели и конфигурации, необходимые для настройки базы данных:
public class SuperContext : DbContext
{
public SuperContext()
: base("DemoDb") {
}
}
В этом параметре тестовая база данных будет настроена против суперконтекста, и все последующие тесты будут проводиться через меньшие контексты. Причина, по которой я не увлекаюсь этим вариантом, заключается в том, что я буду дублировать все конфигурации и модели сущностей, которые я уже создал.
Вариант 2 - создайте пользовательский инициализатор для тестов интеграции, в котором будут выполняться все соответствующие сценарии инициализации db:
public class IntegrationTestInitializer : IDatabaseInitializer<DbContext> {
public void InitializeDatabase(DbContext context) {
/* run scripts to set up database here */
}
}
Эта опция позволяет тестировать истинную структуру базы данных, но также требует обновления при каждом добавлении новых сценариев db.
Вариант 3 - просто проверьте отдельные контексты:
В этой опции можно просто создать EF тестовую базу данных на основе контекста, и все тесты будут работать внутри собственной "песочницы". Причина, по которой мне это не нравится, заключается в том, что вам не кажется, что вы будете тестировать истинное представление базы данных.
В настоящее время я покачусь по вариантам 2. Что вы все думаете? Есть ли лучший способ там?