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

