Xunit项目依赖注入异常求助:无法注入指定服务实例
解决Xunit测试项目中依赖注入的异常问题
问题原因
Xunit本身不支持直接通过构造函数注入服务框架中的依赖项,它会将构造函数参数默认识别为Fixture对象而非DI容器中的服务。直接使用IClassFixture<接口>也不可行,因为Fixture必须是可实例化的具体类,接口无法满足Xunit对Fixture的构造要求。
解决方案
方案1:使用Xunit.DependencyInjection扩展库
这是最便捷的方式,让Xunit支持原生DI语法:
- 安装NuGet包:
Install-Package Xunit.DependencyInjection - 在测试项目中创建专属的
Startup类,配置服务注册:using Microsoft.Extensions.DependencyInjection; using Xunit.DependencyInjection; namespace UserManagement.Tests { public class Startup : DependencyInjectionStartup { public override void ConfigureServices(IServiceCollection services) { // 复用原项目的服务注册逻辑,或手动注册 services.AddSingleton<IHttpDevOpsServiceClient, HttpDevOpsServiceClient>(); services.AddSingleton<ICloudGraphServiceClient, CloudGraphServiceClient>(); // 若需复用原项目Startup的配置,可直接调用: // var originalStartup = new UserManagement.Startup(); // originalStartup.Configure(new FunctionsHostBuilder(services)); } } } - 保持测试类原有构造函数注入写法即可,无需额外修改:
public class Users_AddOrUpdateUsers_Should { private readonly ICloudGraphServiceClient _cloudGraphServiceClient; private readonly IHttpDevOpsServiceClient _httpDevOpsServiceClient; public Users_AddOrUpdateUsers_Should(ICloudGraphServiceClient cloudGraphServiceClient, IHttpDevOpsServiceClient httpDevOpsServiceClient) { _cloudGraphServiceClient = cloudGraphServiceClient; _httpDevOpsServiceClient = httpDevOpsServiceClient; } [Fact] [Trait("Category", "WorkflowTest")] public async Task ReturnCorrectResult_WhenInputIsValid() { // Test Logic } }
方案2:自定义TestFixture封装服务容器
如果不想引入第三方库,可以手动实现Fixture来管理服务:
- 创建封装服务容器的Fixture类:
using Microsoft.Extensions.DependencyInjection; namespace UserManagement.Tests { public class ServiceFixture { public IServiceProvider ServiceProvider { get; } public ServiceFixture() { var services = new ServiceCollection(); // 注册所需服务 services.AddSingleton<IHttpDevOpsServiceClient, HttpDevOpsServiceClient>(); services.AddSingleton<ICloudGraphServiceClient, CloudGraphServiceClient>(); // 构建服务容器 ServiceProvider = services.BuildServiceProvider(); } } } - 修改测试类实现
IClassFixture<ServiceFixture>,通过Fixture获取服务:public class Users_AddOrUpdateUsers_Should : IClassFixture<ServiceFixture> { private readonly ICloudGraphServiceClient _cloudGraphServiceClient; private readonly IHttpDevOpsServiceClient _httpDevOpsServiceClient; public Users_AddOrUpdateUsers_Should(ServiceFixture fixture) { _cloudGraphServiceClient = fixture.ServiceProvider.GetRequiredService<ICloudGraphServiceClient>(); _httpDevOpsServiceClient = fixture.ServiceProvider.GetRequiredService<IHttpDevOpsServiceClient>(); } [Fact] [Trait("Category", "WorkflowTest")] public async Task ReturnCorrectResult_WhenInputIsValid() { // Test Logic } }
内容的提问来源于stack exchange,提问作者Ali Hasan
相关产品推荐
相关产品推荐

