在我的单元测试中,我希望能够在我的工作单元中使用lambda express来获取我的存储库的“查找”功能。例如:
public virtual IQueryable<T> Find(Expression<Func<T, bool>> predicate)
{
// Find OPS
}
我在单元测试中创建了测试列表以表示我的dbSets(同样,我省略了很多抽象,以使这个问题更加简单):
[TestMethod]
public void FindTest()
{
var mockUnitOfWork = new Mock<IUnitOfWork>();
var testList = new List<ListObject>
{
// Test values
}
// Here is where I am stuck:
mockUnitOfWork.Setup(uow => uow.Find(It.IsAny<Expression<Func<ListObject, bool>>>()))
.Returns(/* ???? testList.Where(??????) ???? */);
}
我希望能够使用调用mock的find的方法传递的lambda来搜索我的模拟列表。这可能吗?
编辑:感谢Chris的回答。这是设置代码,用于传递由引用模拟函数的方法传递的lambda表达式:
mockUnitOfWork
.Setup(uow => uow.Find(It.IsAny<Expression<Func<ListObject, bool>>>()))
.Returns(new Func<Expression<Func<ListObject, bool>>, IQueryable<ListObject>>(
expr => testList.Where(expr.Compile()).AsQueryable()));
答案 0 :(得分:23)
是的,有可能。您可以将函数传递给Returns
,将表达式传递给Find
,将表达式编译为Func<ListObject, bool>
,并将其应用于testList
:
mockUnitOfWork
.Setup(uow => uow.Find(It.IsAny<Expression<Func<ListObject, bool>>>()))
.Returns(new Func<Expression<Func<ListObject, bool>>, IQueryable<ListObject>>(
expr => testList.Where(expr.Compile()).AsQueryable()));