如何在.NET8中通过WebApplicationFactory设置TestServer的CultureInfo?
在ASP.NET Core(.NET 8)集成测试中指定区域性启动TestServer
可以通过自定义WebApplicationFactory子类,在启动TestServer时指定CultureInfo,以此验证服务器使用不支持的区域性启动时的失败场景。
实现步骤
- 自定义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; }); } }
- 编写集成测试用例
在测试类中,使用自定义工厂传入不支持的区域性,验证服务器行为是否符合预期(返回错误响应或启动时抛出异常):
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
相关产品推荐
相关产品推荐

