You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:42:21