У меня есть следующие настройки:
- Веб-API .NetCore с использованием EF6 для IdentityServer4.
- Проект модульного тестирования, который тестирует API.
- БДконтекст извлекается из служб веб-хоста, поэтому должен быть одиночным и с той же ссылкой.
Со следующими шагами, ведущими к моей проблеме:
- Перед тестом я заполняю базу данных ресурсом и некоторыми утверждениями.
- В модульном тесте выполняется HTTP-запрос DELETE, в результате которого утверждение удаляется.Это видно в БД при вызове
context.SaveChanges()
. - Затем в модульном тесте утверждается, что заявка была удалена с использованием контекста БД.Это не удается из-за того, что контекст не отображается для обновления.
Проблема заключается в том, что контекст EF DB в модульном тесте, по-видимому, не видит удаления утверждения, которое сделал контекст DB API.
Вещи, которые я пробовал:
- Использовал службы веб-хостинга для извлечения контекста БД, используя
_host.Services.GetServices<ConfigurationDbContext>().First(service => service.GetType() == typeof(ConfigurationDbContext))
. - Во время выполнения я проверил, что в службах существует только один ConfigurationDbContext.
- Перезагрузка записи ресурса контекста модульного теста с использованием
context.Entry(resource).Reload()
. - Повторно извлек контекст из веб-хоста.
Наблюдения:
- Контекст модульного теста представляется актуальным перед удалением.
- Удаление ресурса вместо одного из утверждений, похоже, отслеживается контекстом юнит-теста.
- БД работает так, как ожидается, поэтому тестируемый код работает так, как ожидалось, это всего лишьКонтекст модульного теста, который не обновляется.
- Контекст БД в API во время перехода обновляется, приводя к вызову
context.SaveChanges()
и после него.
Вопросы:
- Кто-нибудь сталкивался с проблемой, когда контекст БД EF не обновляется?
- Есть ли какой-то метод жесткого обновления, который мне не хватает, который заставил бы пересмотреть состояние контекстов с помощьюЧто касается ссылочной БД?
- Существует ли какой-либо кэш, который заставляет контекст БД модульного теста считать его современным.
Большое спасибо заранее.