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

6

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

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

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

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

5个回答

11
您可以强制在当前线程中运行测试时使用特定的区域性 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中运行时却不能。 - Miroslav Bajtoš
你如何在TeamCity中运行nUnit? - Nekresh
1
你尝试过使用[SetCulture("en-US")]属性吗?http://www.nunit.org/index.php?p=setCulture&r=2.5.9 - Nekresh
你尝试过在 AssemblyInfo.cs 中定义你的 AssemblyCulture 吗? [assembly: AssemblyCulture("en-US")] - Martin Buberl

3
似乎TeamCity在不同的线程中运行FixtureSetup和单元测试,或以某种方式修改了CurrentUICulture。将CurrentUICulture和CurrentCulture都设置在SetUp中(而不是FixtureSetup)可以解决这个问题。

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


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;
            }

1
你确定需要恢复文化吗?我快速尝试了一下,似乎 NUnit 框架会恢复文化以确保其不会影响其他测试。 - Dejan
1
也许 NUnit 在不同的测试之间有更好的隔离。当我运行 VSTest.Console 时,使用 Microsoft Tests 出现了问题。 - Michael Freidgeim

0

我有一个类似的问题。TeamCity在传递 CultureInfo 实例时会忽略它们。与其它平台和测试工具(如 ReSharper、MSTest、NCrunch 等)相比,相同的测试和方法在过去 15 年中一直可以正常运行。这个问题与管理区域性上下文(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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接