簡體   English   中英

在 TeamCity 中運行 nUnit 測試時錯誤的 CurrentCulture

[英]Wrong CurrentCulture when running an nUnit test in TeamCity

我有一個依賴於特定文化的單元測試。

在 FixtureSetup 中,我將Thread.CurrentThread.CurrentCultureThread.CurrentThread.CurrentUICulture設置為所需的值 (en-US)。

當我從 Resharper 運行測試時,它通過了。

當我從 TeamCity 運行測試(使用運行程序“NUnit 2.4.6”)時,測試失敗,因為CurrentCulturecs-CZ (我的操作系統的文化)。 然而CurrentUICulture仍然是en-US

您可以強制使用特定的文化在當前線程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;
  }
}

似乎 TeamCity 正在不同的線程中運行 FixtureSetup 和單元測試,或者以某種方式修改CurrentUICulture

SetUp (而不是FixtureSetup )中同時設置CurrentUICultureCurrentCulture解決了這個問題。

從 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

在我的測試中,我在單個測試方法中設置並重置了 CurrentUICulture

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

我有類似的問題。 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM