6

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

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

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

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

4

5 回答 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;
  }
}
于 2011-01-19T08:26:33.637 回答
3

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

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

于 2011-02-15T07:44:47.607 回答
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

于 2016-12-09T12:13:51.500 回答
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;
            }
于 2013-04-18T11:38:47.497 回答
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 框架 4.8

于 2020-12-05T21:10:08.503 回答