4

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

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

4

2 回答 2

6

我将语言测试包装在这样的 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;
    }
}
于 2012-07-10T03:55:32.313 回答
6

这里有两个潜在的问题:

  1. 运行测试时,CurrentUICulture可能未设置为您希望测试的语言
  2. 卫星程序集(在您的示例中只有法语)可能不会部署在单元测试环境中。当 ResourceManager 没有为 UI 文化找到匹配的附属程序集时,它默认为嵌入在项目的 DLL 本身中的基本语言(因此你会得到英语,假设那是你的基本语言)。

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

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

于 2012-07-11T20:23:09.580 回答