CurrentCulture sbagliato durante l'esecuzione di un test di NUnit in TeamCity
-
12-10-2019 - |
Domanda
Ho un'unità-test che si basa su una cultura specifica.
In FixtureSetup, ho impostato sia Thread.CurrentThread.CurrentCulture
e Thread.CurrentThread.CurrentUICulture
al valore desiderato (en-US).
Quando eseguo il test da ReSharper, che passa.
Quando eseguo il test da TeamCity (utilizzando il corridore "NUnit 2.4.6"), il test ha esito negativo, a causa
CurrentCulture
è cs-CZ
(la cultura del mio sistema operativo). Tuttavia CurrentUICulture
è ancora en-US
.
Soluzione
È possibile forzare una cultura specifica per l'esecuzione i test nella tua System.Threading.Thread.CurrentThread
thread corrente
// set CurrentCulture to Invariant
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
// set UI culture to invariant
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
È inoltre possibile utilizzare CultureInfo.GetCultureInfo
per offrire la cultura che si desidera utilizzare. Questo può essere giù nella parte SetUp
di test.
Ricordarsi di riportare la cultura a quella precedente nel vostro TearDown
per garantire l'isolamento
[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;
}
}
Altri suggerimenti
Sembra TeamCity esegue FixtureSetup e unità-test in diversi thread, o in qualche modo modificando CurrentUICulture
.
Impostazione sia CurrentUICulture
e CurrentCulture
in SetUp
(anziché FixtureSetup
) risolto il problema.
A partire da NUnit 2.4.2, è possibile utilizzare l'attributo setCulture.
namespace NUnit.Tests
{
using System;
using NUnit.Framework;
[TestFixture]
[SetCulture("fr-FR")]
public class FrenchCultureTests
{
// ...
}
}
L'esempio è tratto dal link sottostante. Si prega di consultare anche il link per ulteriori dettagli.
Nella mia prova ho impostato e CurrentUICulture ripristino all'interno di singoli metodi sperimentali
var tempCurrentUICulture = Thread.CurrentThread.CurrentUICulture;
try
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-HK" );
actual = target.MethodToTest(resourceSet, localeId);
}
finally
{
Thread.CurrentThread.CurrentUICulture = tempCurrentUICulture;
}