Mock Azure.Data.Tables.TableClient.Query方法的语法问题求助
正确Mock Azure.Data.Tables.TableClient.Query方法的方式
你要Mock的TableClient.Query<T>重载接收的是Expression<Func<T, bool>>类型的filter参数,之前的Setup写法存在语法错误,以下是修正后的实现:
1. 基础版:匹配任意filter表达式
如果不需要校验filter的具体内容,直接返回预设的Pageable结果,Setup代码如下:
Mock<TableClient> mockTableClient = new Mock<TableClient>(); // 构造测试数据 MyPoco[] testData = new MyPoco[] { new MyPoco { PartitionKey = "abc" } }; var page = Page<MyPoco>.FromValues(testData, null, new Mock<Response>().Object); var pageable = Pageable<MyPoco>.FromPages(new[] { page }); // 正确的Setup:匹配任意Expression<Func<MyPoco, bool>>参数 mockTableClient.Setup(c => c.Query<MyPoco>( It.IsAny<Expression<Func<MyPoco, bool>>>(), It.IsAny<int?>(), It.IsAny<IEnumerable<string>>(), It.IsAny<CancellationToken>())) .Returns(pageable);
2. 精准匹配:校验filter为PartitionKey == "abc"
如果需要确保传入的filter是指定的条件,可以用It.Is来匹配表达式:
// 匹配PartitionKey等于"abc"的表达式 mockTableClient.Setup(c => c.Query<MyPoco>( It.Is<Expression<Func<MyPoco, bool>>>(expr => // 解析表达式,判断是否是PartitionKey == "abc" expr.Body is BinaryExpression be && be.NodeType == ExpressionType.Equal && be.Left is MemberExpression me && me.Member.Name == nameof(MyPoco.PartitionKey) && be.Right is ConstantExpression ce && ce.Value.ToString() == "abc"), It.IsAny<int?>(), It.IsAny<IEnumerable<string>>(), It.IsAny<CancellationToken>())) .Returns(pageable);
为什么之前的尝试失败?
- Attempt 1:错误地使用了
Func<MyPoco, bool>而非Expression<Func<MyPoco, bool>>,和实际调用的Query重载不匹配。 - Attempt 2:
It.Is内部的lambda写法错误,正确的用法是传入一个判断表达式是否符合条件的委托,而非It.IsAny<MyPoco> => true这种无效语法。
内容的提问来源于stack exchange,提问作者phil
相关产品推荐
相关产品推荐

