TeamCityでヌニットテストを実行するときの現在の培養が間違っています
-
12-10-2019 - |
質問
特定の文化に依存するユニットテストがあります。
FixTuresetupでは、両方を設定します Thread.CurrentThread.CurrentCulture
と Thread.CurrentThread.CurrentUICulture
目的の値(EN-US)に。
Resharperからテストを実行すると、合格します。
TeamCityからテストを実行すると(ランナー「Nunit 2.4.6 "を使用して)、テストが失敗します。CurrentCulture
は cs-CZ
(私のOSの文化)。でも 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は、さまざまなスレッドでFIXTURESTUPとユニットテストを実行しているか、どういうわけか変更しているようです CurrentUICulture
.
両方を設定します CurrentUICulture
と CurrentCulture
の SetUp
(それ以外の FixtureSetup
) 問題を解決しました。
Nunit 2.4.2から始めて、SetCulture属性を使用できます。
namespace NUnit.Tests
{
using System;
using NUnit.Framework;
[TestFixture]
[SetCulture("fr-FR")]
public class FrenchCultureTests
{
// ...
}
}
この例は、以下のリンクから取られています。詳細については、リンクも参照してください。
私のテストでは、個々のテスト方法内で現在の培養を設定してリセットしました
var tempCurrentUICulture = Thread.CurrentThread.CurrentUICulture;
try
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-HK" );
actual = target.MethodToTest(resourceSet, localeId);
}
finally
{
Thread.CurrentThread.CurrentUICulture = tempCurrentUICulture;
}