在扩展方法中使用WebApplicationBuilder的正确性及测试优化咨询
WebApplicationBuilder扩展方法的使用与测试优化疑问
我想确认自己是否正确使用了WebApplicationBuilder。我通过扩展方法注册项目依赖,直接以WebApplicationBuilder作为扩展对象,这样可以直接从builder里获取IServiceCollection和ConfigurationManager实例,不用向扩展方法传递多个参数。
扩展方法实现
public static class MessageBrokerServiceExtensions { public static void AddMessageBrokerClient( this WebApplicationBuilder builder) { var messageBrokerOptions = builder.Configuration .GetSection(MessageBrokerOptions.Position); builder.Services .AddOptions<MessageBrokerOptions>() .Bind(messageBrokerOptions) .ValidateDataAnnotations() .ValidateOnStart(); builder.Services.AddSingleton<IMessageBrokerContext, MessageBrokerContext>(); // 注册其他依赖 } }
Program.cs中的使用方式
var builder = WebApplication.CreateBuilder(args); builder.AddMessageBrokerClient(); ... var app = builder.Build(); await app.RunAsync();
这段代码运行正常,但我不确定该如何优雅地测试这个扩展方法。我当前的测试代码如下:
当前测试实现
[Fact] public void RegistersDependenciesCorrectly_WithConfiguredClient() { // Arrange var configDictionary = new Dictionary<string, string> { { "MessageBroker:Name", "RabbitMq" }, { "MessageBroker:ConnectionString", "dummy-connection" }, { "MessageBroker:QueueName", "sample-queue" } }; var builder = WebApplication.CreateBuilder(); builder.Configuration.AddInMemoryCollection(configDictionary); // Act builder.AddMessageBrokerClient(); using var app = builder.Build(); // Assert var messageBrokerContextService = app.Services.GetRequiredService<IMessageBrokerContext>(); var messageBrokerOptions = app.Services .GetRequiredService<IOptions<MessageBrokerOptions>>().Value; messageBrokerOptions.Name.Should().Be(MessageBrokerEnum.RabbitMq); messageBrokerOptions.ConnectionString.Should().Be("dummy-connection"); messageBrokerContextService.Should().BeOfType<MessageBrokerContext>(); messageBrokerContextService.MessageBrokerClient .Should().BeOfType<RabbitMqClient>(); }
我对当前测试方式的顾虑是没有释放WebApplicationBuilder实例。请问能否借助WebApplicationFactory作为夹具来优化测试?也欢迎其他优化建议。
注:使用WebApplicationBuilder需要添加以下框架引用:
<ItemGroup> <FrameworkReference Include="Microsoft.AspNetCore.App" /> </ItemGroup>
内容的提问来源于stack exchange,提问作者Parth Sekar
相关产品推荐
相关产品推荐

