2015-10-27 2 views
2

Я играю с веб-приложением 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);)? Я предполагаю, что такой подход был бы неуправляемым, если объектные отношения нетривиальны. Я надеюсь, что я делаю что-то неправильно, и кто-то может указать на мою ошибку :) Спасибо за вашу помощь и время!

ответ

3

Это классический вопрос. Я думаю, у вас есть два варианта.

  1. сделки с ним и вручную настроить отношения, как вам нужно их
  2. вместо того, чтобы издеваться базу данных, использовать SQLLite в качестве движка для ваших тестов и структуры объекта могут сделать свою магию на вершине этого.

Недостатком с 2 является то, что он может добавить достойный кусок времени выполнения для дополнительной настройки, и проблемы с настройкой всплывают и укусят вас на задницу.

Я лично предпочитаю вариант 1.

+1

Спасибо за ответ. Теперь я рад узнать, что это классическая проблема. Я исследую оба варианта и выбираю то, что лучше для моего приложения. Еще раз спасибо! – Softerware

Смежные вопросы