【问题标题】:C# How can I force Localization Culture to en-US for tests projectC#如何强制本地化文化进入美国进行测试项目
【发布时间】:2011-02-15 08:14:13
【问题描述】:

如何在 VS2008 中为 C# 中的测试项目指定具体的本地化文化?我正在构建在 web.config 中指定了非标准文化的 Asp .Net MVC 应用程序,但是如何为该项目的单元测试设置相同的文化?

【问题讨论】:

    标签: c# unit-testing localization locale


    【解决方案1】:

    你可以设置

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); 
    

    在单元测试框架中标记为“测试初始化​​程序”的方法中。

    【讨论】:

    • 你可以在你调用的方法之前设置它,你想拥有特定的文化,你不需要在测试设置中这样做。如果您只需要为一项测试设置它,您可能不想这样做。
    • 我真的很担心挑战这样一个赞成的答案,但我认为应该是 Thread.CurrentThread.CurrentUICulture 而不是 CurrentCulture。 CurrentUICulture 的 Intellisense 本身显示 Gets or sets the current culture used by the Resource Manager to look up culture-specific resources at run time. 我的测试在使用 CurrentCulture 对“fr-FR”文化资源进行测试时失败,但在使用 CurrentUICulture 时通过。
    • web.config 允许通过 指定两种文化。根据您在实际应用程序中使用的属性,您可以为单元测试设置适当的属性。最初的问题询问的是文化,而不是 uiCulture,但这需要解释。
    • 我已经在 VS2015 上测试过了,它绝对是 CultureInfo @NeilMoss
    • @quango 我关心的不是CultureInfo 参考——我在质疑它是否应该是CurrentUICulture 而不是CurrentCulture
    【解决方案2】:

    如果您使用的是 xUnit,您可以将 UseCultureAttribute 添加到您的项目中,如下所述:

    https://github.com/xunit/samples.xunit/blob/master/UseCulture/UseCultureAttribute.cs

    使用它:

    [Fact]
    [UseCulture("en-US")]
    public void MyTest()
    {
        // ...
    }
    

    【讨论】:

    • 对评论有点困惑,但是当您的意思是添加UseCultureAttribute 时,您的意思是将整个文件复制到您的项目中?因为它似乎不包含在核心 nuget github.com/xunit/xunit/issues/290 中,并且永远不会包含。
    • @ahong 是的,您需要复制该属性的源代码。这是 BeforeAfterTestAttribute 的一个示例,它是 xUnit 的一部分。
    • 对于 Nuint,它的 SetCulture
    【解决方案3】:

    如果您想为整个测试套件指定CultureInfo,而不必将其添加到每个TestClassTestInitializer,您可以使用AssemblyInitializeAttribute

    在测试类(用属性[TestClass] 修饰的类)中,添加一个设置DefaultThreadCurrentCultureDefaultThreadCurrentUICulture 的静态方法,然后用[AssemblyInitialize] 修饰该方法。

    然后,此方法将在您的测试套件启动时运行一次,然后再运行任何 TestMethods。 (注意:您的测试套件中可能只有一个使用此属性修饰的此类方法。)

    这是一个使用专用测试类的示例,它只是设置了文化,但您可以将它放在任何测试类中:

    [TestClass]
    public static class InitializeCulture
    {
        [AssemblyInitialize]
        public static void SetEnglishCultureOnAllUnitTest(TestContext context)
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
        }
    }
    

    【讨论】:

    • 好方法,但在有多个线程时要小心。程序集 init 发生一次,其他线程可能以不同方式初始化。将 nunit 或 xUnit 属性用于文化更具弹性和自我记录(并且可以应用于整个类)。
    【解决方案4】:

    对于 nUnit 3,您可以使用属性 [SetUICulture("en-us")]。 这将强制这个单一测试的文化。

    【讨论】:

    • 把它放在你的测试课之前将适用于你的所有测试
    【解决方案5】:
    System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-US");
    System.Threading.Thread.CurrentThread.CurrentCulture = ci;
    

    【讨论】:

      【解决方案6】:

      以下方法对我有用:

      [TestClass]
      public class MyTestClass
      { 
         [TestInitialize]
         public void InitializeTestClass()
         {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
         }
      
         .......... [other unit tests]
      }
      

      【讨论】:

        【解决方案7】:

        没有类似于 web.config 中的设置适用于您的情况。

        您可以尝试按照此处其他答案的建议为每个线程设置它。

        或者,如果您使用的是在 VS.NET 中创建的资源,代码生成会在名为“Culture”的资源类上创建一个静态属性。您可以在单元测试的套件启动方法中设置它。这将适用于您运行的所有测试。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-09-12
          • 1970-01-01
          • 2015-08-27
          • 2016-05-14
          • 1970-01-01
          • 1970-01-01
          • 2011-09-23
          相关资源
          最近更新 更多