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
相关产品推荐
相关产品推荐

