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

Moq中验证受保护方法SendAsync的正确语法是什么?

解决Moq验证HttpMessageHandler受保护SendAsync方法的异常问题

你的问题出在Verify语法使用错误,Moq对受保护方法的验证逻辑和Setup一致,不能把参数匹配器写在方法名字符串里,也不能省略必要的参数匹配器。

正确的Verify写法

将Assert部分最后一行替换为:

mockMessageHandler.Protected()
    .Verify<Task<HttpResponseMessage>>(
        "SendAsync", 
        Times.Once(), 
        ItExpr.IsAny<HttpRequestMessage>(), 
        ItExpr.IsAny<CancellationToken>()
    );

错误原因说明

  • 第一种写法"SendAsync()":省略了方法的参数匹配器,而HttpMessageHandler.SendAsync的实际签名是Task<HttpResponseMessage> SendAsync(HttpRequestMessage, CancellationToken),无参的方法签名不存在,因此抛出异常。
  • 第二种写法"SendAsync(ItExpr.IsAny<HttpRequestMessage>(), ItExpr.IsAny<CancellationToken>())":错误地将参数匹配器嵌入方法名字符串中,Moq会把整个字符串当作方法名去查找,自然找不到对应签名的方法。

Moq对受保护方法的Verify规则和Setup完全一致:方法名仅写名称,参数匹配器作为独立参数传递给Verify方法,同时指定返回类型泛型(避免重载歧义)。

内容的提问来源于stack exchange,提问作者Lucas Hofman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:50:26