如何使用Moq.It.Is<>传递Expression<Func<Destination, bool>>参数?
解决Moq中传递
Expression<Func<Destination, bool>>参数的问题 错误原因分析
你遇到的CS1061错误,核心问题是对It.Is<>的用法理解有误:
在It.Is<Expression<Func<Destination, bool>>>(d=>d.Enable)中,lambda参数d的类型是Expression<Func<Destination, bool>>,而非Destination,所以自然无法访问Enable属性。
正确实现方式
场景1:匹配任意表达式(最常用)
如果测试不需要精确限制传入的表达式,直接用It.IsAny<>匹配该类型的任意参数即可:
DestinationRepository .Setup(x => x.GetAsync( It.IsAny<Expression<Func<Destination, bool>>>(), It.IsAny<Func<IQueryable<Destination>, IOrderedQueryable<Destination>>>(), It.Is<string>(x => x == Constants.IncludeParentDestinationInfo), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<bool>())) .Returns(Task.FromResult(DestinationStub.DestinationsParentInfo)) .Verifiable();
场景2:精确匹配特定表达式实例
如果必须匹配某个特定的表达式,需要确保测试中使用同一个表达式实例,并通过引用相等来匹配:
// 提前定义表达式,后续调用GetAsync时必须使用该实例 Expression<Func<Destination, bool>> expectedExpr = d => d.Enable; DestinationRepository .Setup(x => x.GetAsync( It.Is<Expression<Func<Destination, bool>>>(e => e == expectedExpr), It.IsAny<Func<IQueryable<Destination>, IOrderedQueryable<Destination>>>(), It.Is<string>(x => x == Constants.IncludeParentDestinationInfo), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<bool>())) .Returns(Task.FromResult(DestinationStub.DestinationsParentInfo)) .Verifiable(); // 调用时必须传入同一个expectedExpr实例 var result = await DestinationRepository.GetAsync(expectedExpr, ...);
场景3:匹配表达式的逻辑(特殊需求)
如果需要匹配具有特定逻辑的表达式(比如只要是检查Enable属性的表达式都匹配),可以通过解析表达式结构实现:
// 辅助方法:判断表达式是否为`d => d.Enable`的形式 private bool IsEnableExpression(Expression<Func<Destination, bool>> expr) { if (expr.Body is MemberExpression memberExpr && memberExpr.Member.Name == nameof(Destination.Enable)) { var param = expr.Parameters.FirstOrDefault(); return param != null && memberExpr.Expression == param; } return false; } // Setup时使用辅助方法匹配 DestinationRepository .Setup(x => x.GetAsync( It.Is<Expression<Func<Destination, bool>>>(e => IsEnableExpression(e)), It.IsAny<Func<IQueryable<Destination>, IOrderedQueryable<Destination>>>(), It.Is<string>(x => x == Constants.IncludeParentDestinationInfo), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<bool>())) .Returns(Task.FromResult(DestinationStub.DestinationsParentInfo)) .Verifiable();
内容的提问来源于stack exchange,提问作者partymetal
相关产品推荐
相关产品推荐

