Как включить связанные объекты - PullRequest
1 голос
/ 18 августа 2011

Я хочу создать контрольный пример для метода ниже "GetByEmail".

 public User GetByEmail(string email, bool includeUserRoles = false, bool includeUserType = false)
 { 
    Expression<Func<User>> whereClause = u => u.Email == email; 

    return GetQuery(whereClause, includeUserRoles, includeUserType) .FirstOrDefault(); 
 } 

 private IQueryable<User> GetQuery(Expression<Func<User>> whereClause, 
                                   bool includeUserRoles = false, bool includeUserType = false) 
 { 
   IQueryable<User> query = base.GetQuery(whereClause); 

   if (includeUserRoles) 
     query = query.Include(u => u.UserRoles); 

   if (includeUserType) 
     query = query.Include(u => u.UserType); 

   return query; 
 } 

 protected IQueryable<T> GetQuery<T>(Expression<Func<T>> predicate) where T : EntityBase
 { 
    return predicate != null ? 
             CreateObjectSet<T>().Where(predicate) : 
             CreateObjectSet<T>(); 
 } 

 protected IObjectSet<T> CreateObjectSet<T>() where T : EntityBase 
 { 
   return _context.CreateObjectSet<T>(); 
 } 

 public static IQueryable<T> Include<T>(this IQueryable<T> source, Expression<Func<T>> property)
 { 
   var objectQuery = source as ObjectQuery<T>; 

   if (objectQuery != null) 
   { 
      var propertyPath = GetPropertyPath(property); 
      return objectQuery.Include(propertyPath); 
   } 

   return source; 
 } 

Ниже приведен мой метод контрольного примера -

[Fact] 
private void GetByEmail_PassedEmailAddress_RelatedUser() 
{ 
  //Created fake context 
  var fakeContext = Isolate.Fake.Instance<Entities>(); 

  //Created fake Repository and passed fakeContext to it 
  var fakeRepository = Isolate.Fake.Instance<Repository>(Members.CallOriginal,   ConstructorWillBe.Called, fakeContext);

  //Created fake in memory collection of User 
  var fakeUsers = GetUsers(); 

  Isolate.WhenCalled(() => fakeContext.Context.CreateObjectSet<User>()) 
         .WillReturnCollectionValuesOf(fakeUsers); 

  var User = Isolate.Invoke.Method(fakeRepository, "GetByEmail", "abc@xyz.com", true, true);

  Assert.True(User != null); 
} 

В приведенном выше методе контрольного примера я успешно получил пользователя с пропущенной электронной почтой, но не смог включить другие объекты связанного пользователя.

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

1 Ответ

2 голосов
/ 18 августа 2011

Include - это негерметичная абстракция - она ​​работает только с EF и linq-to-entity и не может быть успешно использована с linq-to-objects.Вы знаете, что вашему модульному тесту нужны заполненные отношения, поэтому ваш метод GetUsers должен подготовить эти данные.В этом суть насмешки - вы не думаете о внутренней реализации смоделированного метода.Вы просто возвращаете то, что должны быть возвращены.

Кстати.в чем смысл вашего теста?Похоже, вы пытаетесь проверить макет - это неправильно.Макет предоставляет правильные данные, и вам нужно только проверить другую функцию, зависящую от максируемого компонента.

...