pgh*_*ech 2 moq repository-pattern c#-4.0
我试图用Moq模拟我的存储库.我试图模拟我的存储库上的所有查询方法.我已经成功地模拟了返回所有类型的方法.
例:
mockProductRepo.Setup(x => x.GetAll()).Returns(products.AsQueryable());
Run Code Online (Sandbox Code Playgroud)
但是,我遇到了一个模拟使用其他方法的方法的问题.例如,我的"FilterBy"方法返回对我的"GetAll"方法的调用,其中Where子句带有表达式
示例:存储库方法
public virtual IQueryable<T> FilterBy(Expression<Func<T, bool>> expression)
{
return GetAll().Where(expression);
}
Run Code Online (Sandbox Code Playgroud)
踢球者是我希望在帮助器类中模拟存储库中的所有方法:
public static IRepository<Product> MockProductRepository(params Product[] products) {
var mockProductRepo = new Mock<IRepository<Product>>();
mockProductRepo.Setup(x => x.GetAll()).Returns(products.AsQueryable());
mockProductRepo.Setup(x => x.FilterBy(It.IsAny<Expression<Func<Product, bool>>>())).Returns(products.AsQueryable().Where(It.IsAny<Expression<Func<Product, bool>>>()));
return mockProductRepo.Object;
}
Run Code Online (Sandbox Code Playgroud)
因此,有没有一种方法可以将其设置为调用另一个模拟方法,而不是我在上面的示例中使用它的方式,而不是上面模拟的FilterBy方法?
UPDATE
我尝试过设置:
mockProductRepo.Setup(x => x.FilterBy(It.IsAny<Expression<Func<Product, bool>>>())).Returns(mockProductRepo.Object.GetAll().Where(It.IsAny<Expression<Func<Product, bool>>>()));
Run Code Online (Sandbox Code Playgroud)
它总是错误"值不能为空.参数:谓词".根据我对堆栈跟踪的理解,它正在抱怨,因为我没有传递"Where"一个谓词.我不确定如何在设置中表示传递给FilterBy方法的表达式在过滤器Where中使用.
我自己想通了.
mockProductRepo.Setup(x => x.FilterBy(It.IsAny<Expression<Func<Product, bool>>>())).Returns((Expression<Func<Product,bool>> filter) => mockProductRepo.Object.GetAll().Where(filter));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1631 次 |
| 最近记录: |