【问题标题】:Wrong CurrentCulture when running an nUnit test in TeamCity在 TeamCity 中运行 nUnit 测试时出现错误的 CurrentCulture
【发布时间】:2011-06-11 14:15:13
【问题描述】:

我有一个依赖于特定文化的单元测试。

在 FixtureSetup 中,我将 Thread.CurrentThread.CurrentCultureThread.CurrentThread.CurrentUICulture 都设置为所需的值(en-US)。

当我从 Resharper 运行测试时,它通过了。

当我从 TeamCity 运行测试时(使用运行器“NUnit 2.4.6”),测试失败,因为 CurrentCulturecs-CZ(我的操作系统的文化)。但是CurrentUICulture 仍然是en-US

【问题讨论】:

    标签: c# .net nunit teamcity currentculture


    【解决方案1】:

    您可以在当前线程System.Threading.Thread.CurrentThread 中强制使用特定的文化来运行测试

    // set CurrentCulture to Invariant
    Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
    // set UI culture to invariant
    Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
    

    您还可以使用CultureInfo.GetCultureInfo 来提供您想要使用的文化。这可以在您的测试的SetUp 部分进行。

    记得将文化恢复到您的TearDown 中的前一个文化以确保隔离

    [TestFixture]
    class MyTest {
      CultureInfo savedCulture;
    
      [SetUp]
      public void SetUp() {
        savedCulture = Thread.CurrentThread.CurrentCulture;
        Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
      }
    
      [TearDown]
      public void TearDown() {
        Thread.CurrentThread.CurrentCulture = savedCulture;
      }
    }
    

    【讨论】:

    • 这正是我所做的。它在 Resharper 中运行我的单元测试时有效,但在 TeamCity 中运行它们时无效。
    • 如何在 TeamCity 中运行 nUnit?
    • 您是否尝试过使用[SetCulture("en-US")] 属性? http://www.nunit.org/index.php?p=setCulture&r=2.5.9
    • 您是否尝试在AssemblyInfo.cs 中定义您的AssemblyCulture? [assembly: AssemblyCulture("en-US")]
    【解决方案2】:

    似乎 TeamCity 正在不同线程中运行 FixtureSetup 和单元测试,或者以某种方式修改 CurrentUICulture

    SetUp(而不是FixtureSetup)中同时设置CurrentUICultureCurrentCulture 解决了这个问题。

    【讨论】:

      【解决方案3】:

      从 NUnit 2.4.2 开始,您可以使用 SetCulture 属性。

      namespace NUnit.Tests
      {
        using System;
        using NUnit.Framework;
      
        [TestFixture]
        [SetCulture("fr-FR")]
        public class FrenchCultureTests
        {
          // ...
        }
      }
      

      示例取自以下链接。另请参阅链接了解更多详情。

      https://github.com/nunit/docs/wiki/SetCulture-Attribute

      【讨论】:

        【解决方案4】:

        在我的测试中,我在单个测试方法中设置和重置 CurrentUICulture

             

                    var tempCurrentUICulture = Thread.CurrentThread.CurrentUICulture;
                    try
                    {
                        Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-HK" );
                         actual = target.MethodToTest(resourceSet, localeId);
                    }
                    finally
                    {
                        Thread.CurrentThread.CurrentUICulture = tempCurrentUICulture;
                    }
        

        【讨论】:

        • 您确定需要恢复文化吗?我快速尝试,在我看来 NUnit 框架恢复了文化,因此它不会泄漏到其他测试中。
        • 可能是 NUnit 在不同测试之间做了更好的隔离。我在运行 VSTest.Console 时遇到了 Microsoft 测试问题。
        【解决方案5】:

        我也有类似的问题。 TeamCity 以某种方式忽略了我即时传递的 CultureInfo 实例。近 15 年来,相同的测试和方法在所有其他平台和运行程序(resharper、mstest、ncrunch 等)上都按预期工作。我的案例不是关于管理文化背景(UICulture、Thread、SetCulture 等)。它必须与 .NET 框架配置或其他东西混淆。令人困惑。

        [Test]
        public void WhatIsGoingOnWithTheCulture()
        {
             //This method should pass. It should return "İ", it is Turkish letter.
             Assert.AreEqual("İ","i".ToUpper(new CultureInfo("tr-TR")));
        }
        
        //String lengths are both 1. Strings differ at index 0.
        //  Expected: "Ý"
        //  But was:  "İ"
        

        TeamCity:2020.2(内部版本 85487),使用 Nunit3 和 NUnitConsole 3.11.1 进行测试

        .Net 框架 4.8

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-20
          • 1970-01-01
          • 2020-04-30
          相关资源
          最近更新 更多