2011-01-19 59 views
5

我有一個依賴於特定文化的單元測試。在TeamCity中運行nUnit測試時錯誤CurrentCulture

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

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

當我運行從TeamCity的測試(使用亞軍「NUnit的2.4.6」),測試失敗,因爲 CurrentCulturecs-CZ(我的操作系統的文化)。然而CurrentUICulture仍然是en-US

回答

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

這正是我所做的。它在Resharper中運行我的單元測試時工作,而不是在TeamCity中運行它們時。 – 2011-01-19 08:48:49

+0

你如何在TeamCity中運行nUnit? – Nekresh 2011-01-19 08:53:03

3

好像TeamCity的運行FixtureSetup和單元測試在不同的線程,或以某種方式修改CurrentUICulture

設置CurrentUICultureCurrentCultureSetUp(而不是FixtureSetup)解決了這個問題。

1

在我的測試,我設置和個人測試方法

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

內復位的CurrentUICulture與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