.NET 6无Startup类下依赖注入单元测试适配问题求助
.NET 6无Startup类下单元测试依赖注入适配方案
问题背景
在.NET 5及更低版本中,通过WebHost.CreateDefaultBuilder().UseStartup<Startup>()加载Startup类完成服务注册,配合自定义的DependencyResolverHelper实现单元测试中的服务获取。但切换到.NET 6 Minimal API(无Startup类)后,使用WebApplicationBuilder构建测试环境时,出现服务未注册错误:No service for type 'MinimalAPI.Services.TokenService.ITokenService' has been registered.
解决方案
核心是在测试基类中复现Minimal API的服务注册逻辑,并适配DependencyResolverHelper以兼容新的依赖注入体系。
1. 重构DependencyResolverHelper
不再依赖IWebHost,直接基于IServiceProvider实现服务获取:
public class DependencyResolverHelper { private readonly IServiceProvider _rootServiceProvider; public DependencyResolverHelper(IServiceProvider rootServiceProvider) => _rootServiceProvider = rootServiceProvider; public T GetService<T>() { using var serviceScope = _rootServiceProvider.CreateScope(); var services = serviceScope.ServiceProvider; try { return services.GetRequiredService<T>(); } catch (Exception e) { Console.WriteLine(e); throw; } } }
2. 修改测试基类BaseTestClass
使用WebApplication.CreateBuilder构建测试环境,并完全复现项目中Program.cs的服务注册逻辑:
public abstract class BaseTestClass { protected DependencyResolverHelper _serviceProvider; public BaseTestClass() { var builder = WebApplication.CreateBuilder(); // 关键:复制Program.cs中的所有服务注册代码 // 示例:注册ITokenService builder.Services.AddScoped<ITokenService, TokenService>(); // 其他服务注册(如数据库上下文、第三方服务等)需与Program.cs保持一致 var app = builder.Build(); _serviceProvider = new DependencyResolverHelper(app.Services); } }
3. 优化:抽离服务注册逻辑(可选)
若项目中服务注册代码较多,可将其抽为扩展方法,避免测试与生产代码重复:
// 项目中新增服务注册扩展类 public static class ServiceCollectionExtensions { public static IServiceCollection AddApplicationServices(this IServiceCollection services) { // 统一注册所有应用服务 services.AddScoped<ITokenService, TokenService>(); // 其他服务注册逻辑 return services; } }
然后在Program.cs中使用:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddApplicationServices(); // 其他配置...
测试基类中同步使用:
var builder = WebApplication.CreateBuilder(); builder.Services.AddApplicationServices(); // 其他测试专属配置...
错误原因说明
.NET 6 Minimal API将服务注册逻辑移至Program.cs,不再依赖Startup类自动加载配置。测试环境构建时,若未手动复现这些服务注册,就会出现目标服务未找到的错误。
内容的提问来源于stack exchange,提问作者fifauser
相关产品推荐
相关产品推荐

