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

如何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这类可选参数?

解决建议

  1. 临时切换到Loose模式排查:先把Mock改成Loose模式跑一遍测试,然后用VerifyAll()或者调试工具看看requestAdapter到底被调用了哪些方法,这样就能找出那些没被Setup的调用点。
  2. 放宽参数匹配范围:先把It.Is<RequestInformation>(...)改成It.IsAny<RequestInformation>(),看看测试能不能通过。如果能,再逐步细化匹配条件,找出是哪个条件没匹配上。
  3. 核对Graph SDK的内部逻辑:可以通过调试跟踪GraphServiceClient.AppRoleAssignments[id].DeleteAsync()的执行流程,确认它到底是怎么构造RequestInformation并调用SendNoContentAsync的,确保你的Setup和实际调用完全对齐。

备注:内容来源于stack exchange,提问作者ChiefTwoPencils

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:08:20