gpt4 book ai didi

c#-4.0 - 使用 Moq 模拟存储库时出现问题

转载 作者:行者123 更新时间:2023-12-03 06:39:34 25 4
gpt4 key购买 nike

我正在尝试用 Moq 模拟我的存储库。我正在尝试模拟存储库中的所有查询方法。我已经成功地模拟了返回所有我模拟出的类型的方法。

示例:

mockProductRepo.Setup(x => x.GetAll()).Returns(products.AsQueryable());

但是,我在模拟使用另一种方法的方法时遇到问题。例如,我的“FilterBy”方法返回对“GetAll”方法的调用,其中包含采用表达式的Where 子句

示例:存储库方法

public virtual IQueryable<T> FilterBy(Expression<Func<T, bool>> expression)
{
return GetAll().Where(expression);
}

最重要的是,我希望在辅助类中模拟存储库中的所有方法:

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;
}

因此,除了上面模拟的 FilterBy 方法之外,是否有一种方法可以将其设置为调用另一个模拟的方法,而不是我在上面的示例中使用的方法?

更新

我已经尝试过设置:

mockProductRepo.Setup(x => x.FilterBy(It.IsAny<Expression<Func<Product, bool>>>())).Returns(mockProductRepo.Object.GetAll().Where(It.IsAny<Expression<Func<Product, bool>>>()));

并且总是错误“值不能为空。参数:谓词”。根据我对堆栈跟踪的理解,它在提示,因为我没有传递“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));

关于c#-4.0 - 使用 Moq 模拟存储库时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5648632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com