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

如何在.NET8中通过WebApplicationFactory设置TestServer的CultureInfo?

在ASP.NET Core(.NET 8)集成测试中指定区域性启动TestServer

可以通过自定义WebApplicationFactory子类,在启动TestServer时指定CultureInfo,以此验证服务器使用不支持的区域性启动时的失败场景。

实现步骤

  1. 自定义WebApplicationFactory
    创建继承自WebApplicationFactory的子类,通过构造函数接收测试用的CultureInfo,并在ConfigureWebHost方法中配置服务器的区域性设置:
public class CultureSpecifiedWebApplicationFactory<TProgram> : WebApplicationFactory<TProgram> where TProgram : class
{
    private readonly CultureInfo _targetCulture;

    public CultureSpecifiedWebApplicationFactory(CultureInfo targetCulture)
    {
        _targetCulture = targetCulture;
    }

    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        // 配置请求本地化选项,限制支持的区域性
        builder.ConfigureServices(services =>
        {
            services.PostConfigure<RequestLocalizationOptions>(options =>
            {
                options.DefaultRequestCulture = new RequestCulture(_targetCulture);
                // 假设应用仅支持en-US和zh-CN
                options.SupportedCultures = new List<CultureInfo> { new("en-US"), new("zh-CN") };
                options.SupportedUICultures = options.SupportedCultures;
            });
        });

        // 设置服务器启动线程的文化,确保启动阶段的文化依赖逻辑生效
        builder.Configure(app =>
        {
            CultureInfo.CurrentCulture = _targetCulture;
            CultureInfo.CurrentUICulture = _targetCulture;
        });
    }
}
  1. 编写集成测试用例
    在测试类中,使用自定义工厂传入不支持的区域性,验证服务器行为是否符合预期(返回错误响应或启动时抛出异常):
public class LocalizationValidationTests
{
    [Theory]
    [InlineData("fr-FR")]
    [InlineData("de-DE")]
    public async Task Unsupported_Culture_Launch_Should_Fail(string cultureName)
    {
        var testCulture = new CultureInfo(cultureName);
        using var factory = new CultureSpecifiedWebApplicationFactory<Program>(testCulture);
        var client = factory.CreateClient();

        // 调用API端点,验证响应状态
        var response = await client.GetAsync("/api/localization-check");
        // 断言请求失败(例如400 Bad Request)
        Assert.False(response.IsSuccessStatusCode);

        // 如果应用在启动阶段就验证区域性,可直接捕获启动异常
        // Assert.ThrowsAsync<InvalidOperationException>(() => factory.CreateClient());
    }
}

补充说明

  • 如果你的应用在启动流程(如Program.cs)中包含区域性合法性验证逻辑,那么TestServer启动时会直接抛出异常,此时测试可通过Assert.ThrowsAsync捕获异常来验证失败场景。
  • 确保RequestLocalizationOptions中的SupportedCultures不包含测试用的区域性,这样请求时会触发本地化错误。
  • .NET 8中WebApplicationFactory的自定义逻辑与.NET 6/7兼容,核心配置入口仍是ConfigureWebHost方法。

内容的提问来源于stack exchange,提问作者asgerhallas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:07:24