Я играю с веб-приложением MVC, размещенным на Azure, используя Entity Framework и SQL Server. Я пытаюсь настроить его для модульных тестов, и я использую Moq для издевки DbContext и устранения некоторых проблем. У меня есть следующие модели:Обманные коллекции моделей в EntityFramework и Moq
class Employee
{
[Key]
public int EmployeeID{get;set;}
[ForeignKey("Business")]
public int BusinessID {get;set;}
public virtual Business {get;set;}
}
class Business
{
public Business()
{
Employees = new HashSet<Employee>();
}
[Key]
public int BusinessID{get;set;}
public virtual ICollection<Employee> Employees{get;set;}
}
Такое, что я могу перебирать все сотрудник бизнеса, а также попросить конкретный работник, его работодатель.
Так что, когда я спускаюсь к насмешливым данным для испытаний, я дразнить DbContext:
var mockContext = Mock<MyDbContext>();
и создать некоторый тестовый набор данных:
List<Business> businesses = new List<Business>();
Business business1 = new Business();
business1.Name = "TestBusiness"
...
Затем дразнит DbSet для бизнеса (так MyDbContext.Businesses не равен нулю):
var queryableTestData = businesses.AsQueryable();
var mockSet = new Mock<DbSet<Business>();
mockSet.As<IDbSet<Business>>().Setup(m => m.Provider).Returns(queryableTestData.Provider);
mockSet.As<IDbSet<Business>>().Setup(m => m.Expression).Returns(queryableTestData.Expression);
mockSet.As<IDbSet<Business>>().Setup(m => m.ElementType).Returns(queryableTestData.ElementType);
mockSet.As<IDbSet<Business>>().Setup(m => m.GetEnumerator()).Returns(() => queryableTestData.GetEnumerator());
mockSet.As<IDbSet<Business>>().Setup(m => m.Local).Returns(mockSet.Object.Local);
И связать его в макете DbContext:
mockContext.Setup(context => context.Businesses).Returns(mockSet.Object);
mockContext.Setup(context => context.Set<T>()).Returns(mockSet.Object);
И я делаю то же самое для создания некоторых данных о сотрудниках-испытателях. Проблема, с которой я сталкиваюсь, состоит в том, что коллекция Business.Employees
всегда возвращает пустой, даже если в коллекциях могут быть данные, которые обычно заполняются во время нормальной работы (т. Е. Существует некоторый Employee with BusinessID == 1 и существует некоторый бизнес с BusinessID == 1, но Business.Employees пуст только во время тестирования).
Есть ли у меня какие-либо параметры, кроме как вручную установить все отношения сущностей (то есть: business.Employees = myTestEmployeeList.Where(e => e.BusinessID == business.BusinessID);
)? Я предполагаю, что такой подход был бы неуправляемым, если объектные отношения нетривиальны. Я надеюсь, что я делаю что-то неправильно, и кто-то может указать на мою ошибку :) Спасибо за вашу помощь и время!
Спасибо за ответ. Теперь я рад узнать, что это классическая проблема. Я исследую оба варианта и выбираю то, что лучше для моего приложения. Еще раз спасибо! – Softerware