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

在扩展方法中使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:06:09