ASP.NET Core MVC同解决方案中Resx文件跨项目共享与测试配置问题
ASP.NET Core MVC本地化Resx文件在集成测试中的共享与读取方案
我来一步步帮你解决这三个本地化测试的问题:
问题1:将Web项目的Resx文件共享给测试项目
要让测试项目能访问Web项目里的Resx文件,最简单的方式是通过文件复制+项目引用实现:
- 在
Application.Web项目中找到Resources\Views\Home\Index.en.resx文件,右键选择「属性」 - 将「复制到输出目录」设置为如果较新则复制(编译时Resx文件会被同步到Web项目的输出目录)
- 在
Application.Tests项目中添加对Application.Web的项目引用(右键测试项目 → 添加 → 项目引用 → 勾选Application.Web)
如果后续需要多项目共享Resx,也可以把Resx文件移到独立的类库项目中,让Web和测试项目都引用这个类库,扩展性更强。
问题2:读取Resx文件中的键值
你找不到Resx类的问题,大概率是Resx文件的代码生成配置出错了。按下面的步骤调整:
重新打开
Index.en.resx的属性面板:- 将「自定义工具」设置为PublicResXFileCodeGenerator(生成public访问修饰符的资源类)
- 检查「自定义工具命名空间」是否为
Application.Web.Resources.Views.Home(对应你的路径Resources\Views\Home,注意是Views不是View,这可能是你之前路径写错的核心原因) - 确认Resx编辑器右上角的「访问修饰符」设置为Public
重新编译
Application.Web项目,之后在测试项目中就能直接引用Resx类了:// 引用Web项目的Resx类 using Application.Web.Resources.Views.Home; [Fact] public async Task ReturnInitialHomePage() { _client.SetAdminClaimsViaHeaders(); var response = await _client.GetAsync("/home/index"); response.EnsureSuccessStatusCode(); var responseString = await response.Content.ReadAsStringAsync(); // 读取Resx中的键值(假设你的键是HomePageTitle,对应值为"Home Page Title") var homePageTitle = Index.HomePageTitle; responseString.Contains(homePageTitle).Should().BeTrue(); }
如果还是找不到类,尝试清理解决方案并重新生成,或者检查Resx文件名是否和类名匹配(比如Index.en.resx对应的类名是Index)。
问题3:配置测试中使用的语言
默认用英文很简单,要支持多语言测试可以通过两种方式实现:
方式1:通过请求头指定语言
在发送请求前,给HttpClient添加Accept-Language请求头,就能指定当前请求的语言:
[Fact] public async Task ReturnHomePageInEnglish() { // 设置英文请求头 _client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("en-US")); _client.SetAdminClaimsViaHeaders(); var response = await _client.GetAsync("/home/index"); // ... 后续断言逻辑 } // 测试其他语言的示例 [Fact] public async Task ReturnHomePageInSpanish() { _client.DefaultRequestHeaders.AcceptLanguage.Add(new StringWithQualityHeaderValue("es-ES")); // ... 后续逻辑 }
方式2:在测试服务器中全局配置语言
如果希望所有测试都默认使用某语言,可以在WebApplicationFactory的配置中覆盖RequestLocalizationOptions:
public class CustomWebApplicationFactory : WebApplicationFactory<Program> { protected override void ConfigureWebHost(IWebHostBuilder builder) { builder.ConfigureServices(services => { // 重新配置本地化选项 services.Configure<RequestLocalizationOptions>(opts => { var supportedCultures = new[] { new CultureInfo("en-US"), new CultureInfo("es-ES") }; opts.DefaultRequestCulture = new RequestCulture("en-US"); opts.SupportedCultures = supportedCultures; opts.SupportedUICultures = supportedCultures; }); }); } }
然后在测试中使用这个自定义工厂创建HttpClient即可。
内容的提问来源于stack exchange,提问作者Jenan
相关产品推荐
相关产品推荐

