【问题标题】:How can I get correct string localization when running my unit tests?运行单元测试时如何获得正确的字符串本地化?
【发布时间】:2012-07-09 21:34:28
【问题描述】:

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

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

【问题讨论】:

    标签: c# testing localization resource-file


    【解决方案1】:

    我将语言测试包装在这样的 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;
        }
    }
    

    【讨论】:

    • 我并不是在尝试进行语言测试。该项目具有贯穿代码的测试,以确保其正常工作。我希望有一种简单的方法可以测试多种语言的代码,以确保本地化不会破坏程序。
    • 你有什么样的测试?如果您使用 NUnit,您可以使用 SetCultureAttribute 使用特定文化运行测试,这将确保使用该文化执行被测代码。见这里:nunit.org/index.php?p=setCulture&r=2.4.8
    • @Hadi,您使用的是System.Threading.CurrentThread.CurrentCulture,但这不会影响本地化(它会影响与文化相关的格式和解析)。您还应该设置System.Threading.CurrentThread.CurrentUICulture
    【解决方案2】:

    这里有两个潜在的问题:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-03
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2012-10-05
      相关资源
      最近更新 更多