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

ASP.NET Core MVC同解决方案中Resx文件跨项目共享与测试配置问题

ASP.NET Core MVC本地化Resx文件在集成测试中的共享与读取方案

我来一步步帮你解决这三个本地化测试的问题:

问题1:将Web项目的Resx文件共享给测试项目

要让测试项目能访问Web项目里的Resx文件,最简单的方式是通过文件复制+项目引用实现:

  1. 在Application.Web项目中找到Resources\Views\Home\Index.en.resx文件,右键选择「属性」
  2. 将「复制到输出目录」设置为如果较新则复制(编译时Resx文件会被同步到Web项目的输出目录)
  3. 在Application.Tests项目中添加对Application.Web的项目引用(右键测试项目 → 添加 → 项目引用 → 勾选Application.Web)

如果后续需要多项目共享Resx,也可以把Resx文件移到独立的类库项目中,让Web和测试项目都引用这个类库,扩展性更强。

问题2:读取Resx文件中的键值

你找不到Resx类的问题,大概率是Resx文件的代码生成配置出错了。按下面的步骤调整:

  1. 重新打开Index.en.resx的属性面板:

    • 将「自定义工具」设置为PublicResXFileCodeGenerator(生成public访问修饰符的资源类)
    • 检查「自定义工具命名空间」是否为Application.Web.Resources.Views.Home(对应你的路径Resources\Views\Home,注意是Views不是View,这可能是你之前路径写错的核心原因)
    • 确认Resx编辑器右上角的「访问修饰符」设置为Public
  2. 重新编译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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:44:49