如何Mock带Header的GraphServiceClient与IGraphService?
解决Mock GraphServiceClient时Header扩展方法引发的异常问题
问题原因
Header是HeaderHelper类的静态扩展方法,Moq框架无法在Setup/验证表达式中直接处理扩展方法——因为它本质不属于目标接口(如IDirectoryObjectTransitiveMemberOfCollectionRequest)的成员,因此会抛出System.NotSupportedException。
解决方案
方法1:跳过扩展方法,直接Mock请求对象的核心方法链
Moq仅能Mock接口的实例方法,我们可以先MockRequest()返回的请求对象,再在该对象上Setup后续的链式调用(如Filter、GetAsync),完全跳过Header扩展方法的Setup:
- Mock请求对象
// 实例化Mock的请求对象,对应Request()返回的类型 var mockTransitiveMemberOfRequest = new Mock<IDirectoryObjectTransitiveMemberOfCollectionRequest>(); // Setup Filter方法,链式调用返回自身以维持方法链 mockTransitiveMemberOfRequest .Setup(x => x.Filter(It.IsAny<string>())) .Returns(mockTransitiveMemberOfRequest.Object); // Setup GetAsync方法,返回预先准备好的测试数据 mockTransitiveMemberOfRequest .Setup(x => x.GetAsync()) .ReturnsAsync(page);
- Setup GraphServiceClient的方法链
让Me.TransitiveMemberOf.Request()返回上面Mock的请求对象:
mockGraph .Setup(x => x.Me.TransitiveMemberOf.Request(It.IsAny<List<Option>>())) .Returns(mockTransitiveMemberOfRequest.Object);
实际代码调用Header()时,扩展方法会自动修改请求对象的Headers集合,但不会影响后续Mock方法的执行,测试可以正常完成。
方法2:验证Header是否被正确设置(可选)
如果需要验证业务代码是否正确添加了指定Header,可以在测试执行完成后,检查Mock请求对象的Headers属性:
// 执行业务测试代码后 var hasConsistencyHeader = mockTransitiveMemberOfRequest.Object.Headers .Any(h => h.Key == "ConsistencyLevel" && h.Value == "eventual"); Assert.True(hasConsistencyHeader, "未正确设置ConsistencyLevel头部");
内容的提问来源于stack exchange,提问作者Yzak
相关产品推荐
相关产品推荐

