You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:25:34