У меня есть приложение ASP.NET MVC Core, для которого я пишу модульные тесты. Я использую InMemoryDatabase и отлично работает. Я хочу инициализировать базу данных один раз для тестового запуска. Таким образом, у меня есть статический класс:Повторное использование InMemoryDatabase для модульных тестов
public static class DbInitialize {
private static MyDbContext _db;
public static MyDbContext Initialize() {
if (_db != null) {
return _db;
}
DbContextOptionsBuilder<MyDbContext> optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
optionsBuilder.UseInMemoryDatabase();
_db = new MyDbContext(optionsBuilder.Options);
....... (populating mock data) .............
_db.SaveChanges();
return _db;
}
}
прекрасно работает для одного тестового класса (скажем, HomeControllerTests
) и всех его специфических тестов. Однако, если у меня есть другой тестовый класс (CustomerControllerTests
), и я звоню DbInitialize.Initialize()
- я вижу, что _db
имеет значение NULL, но база данных не была уничтожена - я получаю ошибку ключа во время SaveChanges()
. Есть ли лучший способ инициализировать базу данных только один раз и получить «строку соединения» (из-за отсутствия лучшего слова), если она уже запущена и работает?
Что произойдет, если вы каждый раз создаете 'DbContext' с вашими параметрами (без данных)? –
@GabrielGM - Я не уверен, что понимаю ваш вопрос. Если я создам DbContext без данных вообще - ничего плохого не произойдет, за исключением того, что у меня нет данных, а модульные тесты явно не работают. – Felix
Вы говорите, что ваш '_db' является нулевым, хотя он и существует в памяти. Когда это произойдет, вы можете воссоздать '_db'. Я имею в виду, Create и семена в первый раз. После этого просто создайте. –