如何Moq GraphServiceClient的DeleteAsync()方法?使用MockBehavior.Strict时测试失败的求助
如何Moq GraphServiceClient的DeleteAsync()方法?使用MockBehavior.Strict时测试失败的求助
我最近碰到个头疼的问题:下面这段测试代码在启用MockBehavior.Strict的时候总会失败,但里面用到的requestAdapter已经在200多个其他测试里正常工作了,实在搞不懂哪里出问题。
[Test] public async Task DeleteAsync_OfAppRoleAssignment_FindsMoqSetup() { var requestAdapter = RequestAdapterMockFactory.Create(); requestAdapter.Setup(a => a.SendNoContentAsync( It.Is<RequestInformation>(info => info.HttpMethod == Method.DELETE && info.OriginalRequestUrl.ToString().Contains("/appRoleAssignments/"))), It.IsAny<CancellationToken>()) .Returns(Task.CompletedTask); // 初始化GraphServiceClient并调用DeleteAsync的逻辑 var graphClient = new GraphServiceClient(requestAdapter); await graphClient.AppRoleAssignments["target-assignment-id"].DeleteAsync(); requestAdapter.VerifyAll(); }
可能的问题排查方向
- Strict模式的严格校验特性:
MockBehavior.Strict要求所有被Mock对象的调用都必须提前Setup,哪怕是你没在意的小调用。会不会GraphServiceClient在执行DeleteAsync时,除了SendNoContentAsync,还调用了requestAdapter的其他方法?比如获取请求配置、处理头部信息之类的步骤? - 参数匹配不精确:你在Setup里只校验了
RequestInformation的HttpMethod和Url,但实际调用时这个对象的其他属性会不会被Moq的Strict模式检查到?或者有没有可能OriginalRequestUrl的格式和你预期的不一样?比如大小写差异、额外的查询参数? - 方法重载不匹配:
SendNoContentAsync可能有多个重载版本,你Setup的是不是和GraphServiceClient实际调用的那个不一致?比如有没有遗漏了RequestOptions这类可选参数?
解决建议
- 临时切换到Loose模式排查:先把Mock改成Loose模式跑一遍测试,然后用
VerifyAll()或者调试工具看看requestAdapter到底被调用了哪些方法,这样就能找出那些没被Setup的调用点。 - 放宽参数匹配范围:先把
It.Is<RequestInformation>(...)改成It.IsAny<RequestInformation>(),看看测试能不能通过。如果能,再逐步细化匹配条件,找出是哪个条件没匹配上。 - 核对Graph SDK的内部逻辑:可以通过调试跟踪
GraphServiceClient.AppRoleAssignments[id].DeleteAsync()的执行流程,确认它到底是怎么构造RequestInformation并调用SendNoContentAsync的,确保你的Setup和实际调用完全对齐。
备注:内容来源于stack exchange,提问作者ChiefTwoPencils
相关产品推荐
相关产品推荐

