2010-11-26 6 views
4

У меня есть Generic хранилище и пытаются отливать .Returns к Expression но отказаться ... Мой код выглядит следующим образом:Moq - Mock Generic Repository

public RepositoryTest() 
{ 
    IList<MockObjectSet> mocks = new List<MockObjectSet>() 
    { 
     new MockObjectSet { FirstName = "Beta", LastName = "Alpha", Mobile = 12345678 }, 
     new MockObjectSet { FirstName = "Alpha", LastName = "Beta", Mobile = 87654321 } 
    }; 

    var mockRepository = new Mock<IRepository<MockObjectSet>>(); 

    mockRepository.Setup(x => x.GetBy(It.IsAny<Expression<Func<MockObjectSet, bool>>>())) 
     .Returns((Expression<Func<MockObjectSet, bool>> predicate) => mocks.Where(predicate).ToList()); 

} 

Это просто сказать

Delegate System.Func<System.Collections.Generic.IEnumerable<expWEBCRM.Tests.Repositories.MockObjectSet>> does not take 1 arguments

Заранее благодарен!

ответ

4

Вам необходимо явно указать параметры типа перегрузки Returns так:

mockRepository.Setup(x => x.GetBy(It.IsAny<Expression<Func<MockObjectSet, bool>>>())) 
     .Returns<Expression<Func<MockObjectSet, bool>>>(predicate => mocks.Where(predicate).ToList()); 

EDIT Репозиторий принимает выражение и использует его на IQueryable. Исходный источник данных на самом деле равен IEnumerable. Разница в интерфейсе LINQ это один принимает лямбда, то один выражение:

IQueryable<T>.Where(Expression<Func<T,bool>>); 
IEnumerable<T>.Where(Func<T,bool>); 

Что происходит в этом случае пытается вызвать IEnumerable.Where с Expression<Func<T,bool>>. Самый простой способ исправить это - установить источник как IQueryable:

public RepositoryTest() 
{ 
    IQueryable<MockObjectSet> mocks = new List<MockObjectSet>() 
    { 
     new MockObjectSet { FirstName = "Beta", LastName = "Alpha", Mobile = 12345678 }, 
     new MockObjectSet { FirstName = "Alpha", LastName = "Beta", Mobile = 87654321 } 
    }.AsQueryable(); 

    var mockRepository = new Mock<IRepository<MockObjectSet>>(); 

    mockRepository.Setup(x => x.GetBy(It.IsAny<Expression<Func<MockObjectSet, bool>>>())) 
     .Returns<Expression<Func<MockObjectSet, bool>>>(predicate => mocks.Where(predicate).ToList()); 

} 
+0

Отлично! Но теперь появляется еще одна ошибка: «System.Collections.Generic.IList » не содержит определения для «Где» и лучший метод перегрузки расширения »System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable , System.Func ) 'имеет некоторые недопустимые аргументы – ebb 2010-11-26 21:53:25