.NET集成测试中正确Mock请求客户端类的实现方法
问题根因
Mock未生效的核心原因是依赖注册逻辑错误:
- 你在
ConfigureTestServices中调用services.AddSingleton(dependency)时,没有显式指定服务类型为IGetAppointmentsClient,默认会把传入的Mock对象注册为其运行时的代理类类型,和控制器构造函数依赖的IGetAppointmentsClient接口类型不匹配。 - DI容器解析
IGetAppointmentsClient类型时,找不到你注册的Mock实例,就会继续使用Program启动阶段注册的真实客户端实现,最终发起真实外部请求触发异常。
另外你贴的AppointmentController构造函数存在语法笔误,也会导致运行时错误。
修复步骤
- 修正测试服务替换逻辑,显式移除原有真实客户端注册,再绑定Mock实例到对应接口类型。修改
TestServer中的ConfigureTestServices代码:
如果不需要通用依赖替换逻辑,也可以直接在.ConfigureTestServices(services => { // 保留原有认证、授权测试配置 services.AddAuthentication(TestAuthHandler.AuthenticationScheme) .AddScheme<AuthenticationSchemeOptions, TestAuthHandler>( TestAuthHandler.AuthenticationScheme, options => { }); AddAuthorizationForTest(services); // 移除原有IGetAppointmentsClient的真实注册 var clientServiceDesc = services.FirstOrDefault( s => s.ServiceType == typeof(IGetAppointmentsClient)); if (clientServiceDesc != null) { services.Remove(clientServiceDesc); } // 遍历传入的依赖重写集合,显式按接口类型注册 foreach (var dependency in _dependencyOverrides) { var serviceType = dependency.GetType().GetInterfaces() .FirstOrDefault(i => i.Name.StartsWith("I") && i.Name.Contains("Client")); // 针对IClient这类接口依赖,显式绑定接口到Mock实例 if (serviceType != null) { services.AddSingleton(serviceType, dependency); } } });ConfigureTestServices里写死注册,逻辑更直观:services.AddSingleton<IGetAppointmentsClient>(GetAppointmentsClientMock.Object); - 修复
AppointmentController构造函数的语法笔误,去掉多余的右括号:public AppointmentController(IGetAppointmentsClient appointmentsClient) { _appointmentsClient = appointmentsClient; }
修复后测试运行时,DI容器会正确解析到你Setup的Mock客户端,不会触发真实外部请求,接口会正常返回200 OK。
内容的提问来源于stack exchange,提问作者Bunnynut
相关产品推荐
相关产品推荐

