如何在运行单元测试时获得正确的字符串本地化?

use*_*430 3 c# testing localization resource-file

我有一个需要支持法语和英语的项目.我将所有字符串放入资源文件中.当我在Visual Studio中调试程序时,我可以用法语成功查看该程序.但是,当我运行该程序的测试时,该程序将恢复为英语.我将法语资源dll文件添加到部署中.这允许我用法语调试单个单元测试,但是当我单击Test - > Debug - > All Tests in Solution时,程序将以英语运行.

我试图将[DeploymentItem(@"..\bin\x86\Release\fr","fr-FR")]添加到其中一个测试中,但这没有帮助.有没有人对如何解决这个问题有任何建议?谢谢!

Had*_*ari 5

我在这样的using语句中包装语言测试:

[Test]
public void Loads_correct_labels_from_language()
{
    using(new LanguageSwitchContext("fr"))
    {
       var okayString = MyResources.Okay_Button;
       Assert.Equals("your localized string here", okayString);
    }
}

public class LanguageSwitchContext : IDisposable
{
    public CultureInfo PreviousLanguage { get; private set; }

    public LanguageSwitchContext(CultureInfo culture) 
    {
        PreviousLanguage = System.Threading.Thread.CurrentThread.CurrentCulture;
        System.Threading.Thread.CurrentThread.CurrentCulture = culture;
    }

    public LanguageSwitchContext(string language) 
    {
        //create culture from language
    }

    public void Dispose() 
    {
        System.Threading.CurrentThread.CurrentCulture = PreviousCulture;
    }
}
Run Code Online (Sandbox Code Playgroud)


Cla*_*fou 5

这里有两个潜在的问题:

  1. 运行测试时,CurrentUICulture可能无法设置您要测试的语言
  2. 可能未在单元测试环境中部署附属程序集(在您的示例中仅为法语).当ResourceManager没有为UI文化找到匹配的附属程序集时,它默认使用嵌入在项目DLL本身中的基本语言(因此,您将获得英语,假设这是您的基本语言).

对于1.您可以确保System.Threading.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");在测试或测试类的初始化中设置.

对于2.使用DeploymentItemAttribute你提到的类似应该工作.确认在使用法语成功运行应用程序时部署的附属程序集是否会在测试部署中使用相同名称和同一子文件夹进行复制.这可能更像是[DeploymentItem(@"bin\fr-FR", "fr-FR")]