Cha*_*fow 14 c# lambda unit-testing moq
在我的单元测试中,我希望能够在我的工作单元中使用lambda express来获取我的存储库的"查找"功能.例如:
public virtual IQueryable<T> Find(Expression<Func<T, bool>> predicate)
{
// Find OPS
}
Run Code Online (Sandbox Code Playgroud)
我在单元测试中创建了测试列表以表示我的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(??????) ???? */);
}
Run Code Online (Sandbox Code Playgroud)
我希望能够使用调用mock的find的方法传递的lambda来在我的模拟列表中进行搜索.这可能吗?
编辑:感谢克里斯的回答.这是设置代码,用于传递由引用模拟函数的方法传递的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()));
Run Code Online (Sandbox Code Playgroud)
Chr*_*tle 24
对的,这是可能的.您可以将函数Returns传递给传递的表达式Find,将表达式编译为a 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()));
Run Code Online (Sandbox Code Playgroud)