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

升级至Microsoft Graph v5后GraphServiceClient Mock失效求助

解决Microsoft Graph v5中Mock GraphServiceClient的问题

在Microsoft Graph v5中,GraphServiceClient被改为密封类(sealed),Moq等Mock框架无法直接创建密封类的代理,这就是你遇到Can not instantiate proxy of a class Microsoft.Graph.GraphServiceClient异常的原因。官方推荐的Mock方案是通过MockIRequestAdapter接口来实现,具体步骤如下:

核心思路

GraphServiceClient的所有请求都会通过IRequestAdapter执行,因此Mock这个接口并注入到真实的GraphServiceClient实例中,就能拦截并模拟所有请求的返回结果。

代码示例

初始化Mock对象与GraphServiceClient

// 创建IRequestAdapter的Mock实例
private readonly Mock<IRequestAdapter> _mockRequestAdapter = new(MockBehavior.Strict);

// 使用Mock的适配器实例化真实的GraphServiceClient
private readonly GraphServiceClient _graphClient;

public YourTestClass()
{
    _graphClient = new GraphServiceClient(_mockRequestAdapter.Object);
}

模拟特定请求的返回结果

以模拟获取当前用户信息为例:

[Fact]
public async Task GetCurrentUser_ReturnsMockedUser()
{
    // 定义模拟的用户数据
    var mockedUser = new User
    {
        Id = "mock-user-123",
        DisplayName = "Mock Test User",
        Mail = "mock.user@example.com"
    };

    // 设置Mock适配器的SendAsync方法,拦截匹配的请求并返回模拟数据
    _mockRequestAdapter
        .Setup(adapter => adapter.SendAsync<User>(
            // 匹配请求路径为"/me"的GET请求
            It.Is<RequestInformation>(ri => 
                ri.HttpMethod == Method.GET && 
                ri.Url.AbsolutePath.EndsWith("/me")),
            It.IsAny<ParserConfiguration<User>>(),
            It.IsAny<CancellationToken>()))
        .ReturnsAsync(mockedUser);

    // 调用GraphServiceClient的业务方法
    var result = await _graphClient.Me.GetAsync();

    // 断言结果符合预期
    Assert.Equal("mock-user-123", result.Id);
    Assert.Equal("Mock Test User", result.DisplayName);
}

额外说明

  • 可以通过RequestInformation的属性(如HttpMethod、Url、Headers等)实现更精细的请求匹配,满足不同测试场景的需求。
  • 若需要模拟分页、错误返回等复杂场景,只需调整Setup中的返回逻辑(比如返回Task.FromException模拟请求失败)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:47:46