Mauvais CurrentCulture lors de l'exécution d'un test nUnit à TeamCity
-
12-10-2019 - |
Question
J'ai une unité de test qui repose sur une culture spécifique.
FixtureSetup, je mis à la fois Thread.CurrentThread.CurrentCulture
et Thread.CurrentThread.CurrentUICulture
à la valeur désirée (en-US).
Quand je lance le test de ReSharper, il passe.
Quand je lance le test de TeamCity (en utilisant le coureur "NUnit 2.4.6"), le test échoue, car
CurrentCulture
est cs-CZ
(la culture de mon OS). Cependant CurrentUICulture
est encore en-US
.
La solution
Vous pouvez forcer une culture spécifique pour exécuter vos tests dans votre System.Threading.Thread.CurrentThread
courant de fil
// set CurrentCulture to Invariant
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
// set UI culture to invariant
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
Vous pouvez également utiliser CultureInfo.GetCultureInfo
pour fournir la culture que vous souhaitez utiliser. Cela peut être dans la partie SetUp
de vos tests.
Rappelez-vous de restaurer la culture à la précédente dans votre TearDown
pour assurer l'isolation
[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;
}
}
Autres conseils
Il semble que TeamCity est en cours d'exécution et l'unité FixtureSetup test dans différents fils, ou de modifier d'une certaine manière CurrentUICulture
.
Réglage des deux CurrentUICulture
et CurrentCulture
dans SetUp
(au lieu de FixtureSetup
) a résolu le problème.
A partir de NUnit 2.4.2, vous pouvez utiliser l'attribut setCulture.
namespace NUnit.Tests
{
using System;
using NUnit.Framework;
[TestFixture]
[SetCulture("fr-FR")]
public class FrenchCultureTests
{
// ...
}
}
L'exemple est pris à partir du lien ci-dessous. S'il vous plaît se référer également le lien pour plus de détails.
Dans mon test, je l'ai remis à zéro et CurrentUICulture réglé au sein de la méthode de test individuel
var tempCurrentUICulture = Thread.CurrentThread.CurrentUICulture;
try
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-HK" );
actual = target.MethodToTest(resourceSet, localeId);
}
finally
{
Thread.CurrentThread.CurrentUICulture = tempCurrentUICulture;
}