在TeamCity中运行nUnit测试时,CurrentCulture错误

时间:2011-01-19 07:35:18

标签: c# .net nunit teamcity currentculture

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

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

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

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

5 个答案:

答案 0 :(得分:8)

您可以强制使用特定的文化来在当前线程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;
  }
}

答案 1 :(得分:3)

看起来TeamCity在不同的线程中运行FixtureSetup和unit-test,或以某种方式修改CurrentUICulture

CurrentUICulture(而非CurrentCulture)中设置SetUpFixtureSetup解决了这个问题。

答案 2 :(得分:2)

从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

答案 3 :(得分:1)

在我的测试中,我在单独的测试方法中设置并重置了CurrentUICulture

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

答案 4 :(得分:0)

我有类似的问题。 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 Framework 4.8