gpt4 book ai didi

c# - 在单元测试 .Net core 3.1 后台服务时,无法解析 IConfiguration

转载 作者:行者123 更新时间:2023-12-04 10:31:53 24 4
gpt4 key购买 nike

我正在尝试为 BackgroundService 编写单元测试用例 Worker.cs .我已阅读 Stack Overflow Question

但我仍然得到错误

"Unable to resolve service for type 'Microsoft.Extensions.Configuration.IConfiguration' while attempting to activate 'AutoClueArchiver.Worker'.


public WorkerTests()
{
_config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", true, true)
.AddJsonFile("appsettings.Development.json", true, true)
.AddJsonFile("appsettings.local.json", true, true)
.AddJsonFile("\\\\charon.cmiprog.com\\devinet\\Configuration\\" + "ApiEndpoints.json", false, true)
.AddJsonFile("ApiEndpoints.local.json", true, true)
.AddJsonFile("\\\\charon.cmiprog.com\\devinet\\Configuration\\" + "Kafka.json", false, true)
.AddEnvironmentVariables().Build();
_mockedKafkaTopicConsumerManager =new Mock<IKafkaTopicConsumerManager>();
_mockedMessageProcessor=new Mock<IMessageProcessingCapable>();
}

[Fact]
public async Task ExecuteAsync_Test()
{
IServiceCollection services=new ServiceCollection();
services.AddSingleton<IConfigEntriesClientService, ConfigEntriesClientServiceInjectable>();
services.AddSingleton(typeof(IProducer), s => new KafkaProducer(s.GetRequiredService<IProducer<string, string>>(), s.GetRequiredService<IConfiguration>().GetValue<string>("Shared:Kafka:TopicSuffix")));
services.AddSingleton(typeof(IProducer<string, string>), c => new ProducerBuilder<string, string>(KafkaConfigs(c)).Build());
services.AddHttpClient();
services.AddScoped<IPolicyApiClient, PolicyApiClient>();
services.AddTransient<IFilterMessages, MessageFilter>();
services.AddTransient<IArchiveAutoClues, Archiver>();
services.AddTransient<IFileSystem, FileSystem>();
services.AddTransient<ISaveDocument, DocumentManager>();
services.AddTransient<IKafkaTopicConsumerManager, KafkaTopicConsumerManager>();
services.AddTransient<IMessageProcessingCapable, ConsumerInitializer>();
services.AddTransient<Consumer>();
services.AddTransient<IExceptionPublisher, ExceptionPublisher>();
services.AddTransient<IHttpContextAccessor, HttpContextAccessor>();
services.AddScoped(sp => new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate });
services.AddHttpClient<IBaseApiClient, BaseApiClient>().ConfigurePrimaryHttpMessageHandler(
sp => new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }
);

var worker=services.AddHostedService<Worker>();
var serviceProvider=services.BuildServiceProvider();
var backgroundService = serviceProvider.GetService<IHostedService>() as Worker;
await backgroundService?.StartAsync(CancellationToken.None);
await Task.Delay(1000);
await backgroundService?.StopAsync(CancellationToken.None);
//await backgroundService.ExecuteAsync(new CancellationToken());
//Any way to access ExecuteAsync here since I get protection level error as
//ExecuteAsync is protected
_mockedKafkaTopicConsumerManager.Verify(c=>c.StartConsumption
(It.IsAny<CancellationToken>(),
_mockedMessageProcessor.Object,
It.IsAny<string>(),
It.IsAny<string>(),
It.IsAny<List<string>>(),
It.IsAny<string>(),
It.IsAny<int>()),Times.Once);
}

最佳答案

我看不到你在哪里添加 IConfiguration到服务集合。您在构造函数中构建了一个,但未将其添加到测试中的服务集合中。

[Fact]
public async Task ExecuteAsync_Test() {

IServiceCollection services = new ServiceCollection();
services.AddSingleton<IConfiguration>(_config);

//...

关于c# - 在单元测试 .Net core 3.1 后台服务时,无法解析 IConfiguration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60387013/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com