#c# #mocking #entity-framework-core #dbcontext #xunit
#c# #издевательство #сущность-фреймворк-ядро #dbcontext #xunit
Вопрос:
Вступление
У меня проблемы с издевательством над базой данных из-за моих отношений «один ко многим» между пользователем и сотрудниками. Занятость правильно добавляется в макет базы данных, но когда тот же объект добавляется в коллекцию заданий в пользовательской сущности, он не загружается.
Код
Это всего лишь важные части для этого случая двух классов
Пользователь
public virtual ICollection<Employement> Employments { get; } = new List<Employment>();
Занятость
[Required]
[ForeignKey(nameof(User))]
public Guid UserId { get; set; }
public virtual User? User { get; set; }
Пример
Я использую что-то вызываемое EntityHelper
для создания сущностей. Я создаю объект занятости, использую его при создании объекта User (все они создаются правильно при отладке). Я использую db.AddRange()
для добавления объектов в базу данных.
Вот как это выглядит.
Проблема
Как я упоминал ранее, почти все правильно добавляется в базу данных. Пользователь с его данными и занятость. Однако коллекция заданий у пользователя пуста (даже если она есть у созданного мной объекта user). Я не уверен, является ли это проблемой с EF Core или xUnit или что это может быть.
Некоторые другие факты, которые было бы полезно знать:
- В тесте используется база данных SQLite в памяти
- Он основан на DbContext
Комментарии:
1. Привет, Антон, поскольку вы используете базу данных в памяти поверх контекста базы данных, это больше похоже на интеграционный тест, а интеграционные тесты обычно ничего не
mock
делают, в том смысле, что вы хотели бы протестировать конкретную реализацию вашего кода. Можете ли вы предоставить сообщение об ошибке, которое вы получаете, вместе с изображением отладчика, когда он выдает (я подозреваю) исключение?. Если вы остановите отладчик, оценитеDbContext.User.ToList()
, получите ли вы то, что ожидали?
Ответ №1:
Ответ отсутствовал .include(u => u.Employments)
в запросе LINQ, который извлекал пользователей из базы данных.