Microsoft Graph SDK V5(5.2版)Mock注入失败问题求助
我正在使用Microsoft Graph SDK最新版本(5.2),已将GraphServiceClient注册到依赖注入中。该客户端通过构造函数注入到另一服务中,在对该类进行单元测试时,需要注入Mock的GraphServiceClient,但尝试后始终失败,提示找不到匹配的构造函数。几乎找不到该新版本的相关文档或示例。
曾尝试以下示例代码:
// Arrange var mockAuthProvider = new Mock<IAuthenticationProvider>(); var mockHttpProvider = new Mock<IHttpProvider>(); var mockGraphClient = new Mock<GraphServiceClient>(mockAuthProvider.Object, mockHttpProvider.Object);
但发现IHttpProvider在该版本中已失效,无法在NuGet包中找到。若仅使用Mock的身份验证提供者,会出现构造函数错误:
var mockAuthProvider = new Mock<IAuthenticationProvider>(); var mockGraphClient = new Mock<GraphServiceClient>(mockAuthProvider.Object);
错误信息:
System.ArgumentException : Can not instantiate proxy of class:
Microsoft.Graph.GraphServiceClient. Could not find a constructor that
would match given arguments:
Castle.Proxies.IAuthenticationProviderProxy (Parameter
'constructorArguments')
方案1:Mock IGraphServiceClient接口(推荐)
Microsoft Graph SDK 5.x版本中,GraphServiceClient实现了IGraphServiceClient接口。最佳实践是让你的服务依赖于IGraphServiceClient接口而非具体的GraphServiceClient类,这样单元测试时可以直接Mock接口,完全避开构造函数匹配问题。
步骤:
- 修改依赖注入注册:
// 原注册方式(依赖具体类) // services.AddScoped<GraphServiceClient>(provider => ...); // 修改为注册接口和实现类 services.AddScoped<IGraphServiceClient, GraphServiceClient>(provider => { // 原有的GraphServiceClient初始化逻辑 var authProvider = provider.GetRequiredService<IAuthenticationProvider>(); return new GraphServiceClient(authProvider); }); - 修改服务类的构造函数:
public class YourBusinessService { private readonly IGraphServiceClient _graphClient; // 依赖接口而非具体类 public YourBusinessService(IGraphServiceClient graphClient) { _graphClient = graphClient; } // 业务逻辑方法 public async Task DoSomething() { await _graphClient.Me.GetAsync(); } } - 单元测试中Mock接口:
// Arrange var mockGraphClient = new Mock<IGraphServiceClient>(); // 配置Mock的方法行为,比如模拟Me.GetAsync()的返回 mockGraphClient.Setup(client => client.Me.GetAsync(It.IsAny<CancellationToken>())) .ReturnsAsync(new User { DisplayName = "Test User" }); // 注入Mock到你的服务类 var yourService = new YourBusinessService(mockGraphClient.Object); // Act & Assert // ... 执行测试逻辑并验证
方案2:直接Mock GraphServiceClient类(不推荐)
如果必须Mock具体类,需要匹配GraphServiceClient的有效构造函数。在5.2版本中,可使用接受IAuthenticationProvider和GraphClientOptions的构造函数:
// Arrange var mockAuthProvider = new Mock<IAuthenticationProvider>(); var graphOptions = new GraphClientOptions(); // 提供空的配置选项 var mockGraphClient = new Mock<GraphServiceClient>(mockAuthProvider.Object, graphOptions); // 配置Mock行为 mockGraphClient.Setup(client => client.Me.GetAsync(It.IsAny<CancellationToken>())) .ReturnsAsync(new User { DisplayName = "Test User" });
注意:直接Mock类的灵活性不如Mock接口,且后续SDK版本更新可能改变构造函数签名,导致测试失效,因此优先推荐方案1。
内容的提问来源于stack exchange,提问作者Webezine

