2010-11-26 56 views
4

我有一个通用的存储库,并试图投的.Returns的表达,但它拒绝...我的代码如下:起订量 - 模拟通用库

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()); 

编辑对存储库的表达,并用它在IQueryable。模拟数据源实际上是IEnumerable。在LINQ接口的区别是一个需要拉姆达的一个表达式:

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

会发生什么事在这种情况下试图调用IEnumerable.WhereExpression<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 '不包含'Where'和最佳扩展方法重载的定义'System.Linq.Enumerable.Where ( System.Collections.Generic.IEnumerable ,System.Func )'有一些无效的参数 – ebb 2010-11-26 21:53:25