Xunit и EFCore — насмешливые отношения «один ко многим» не работают

#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, который извлекал пользователей из базы данных.