Неправильная текущая культура при проведении теста NUNIT в TeamCity
-
12-10-2019 - |
Вопрос
У меня есть единственный тест, который опирается на определенную культуру.
В FitctureSetup я установил оба Thread.CurrentThread.CurrentCulture
а также Thread.CurrentThread.CurrentUICulture
к желаемому значению (EN-US).
Когда я запускаю тест из Resharper, он проходит.
Когда я запускаю тест из TeamCity (используя бегун «NUNIT 2.4.6»), тест не удается, потому чтоCurrentCulture
является cs-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 использует FictureSetup и Unit-test в разных потоках или каким-то образом модифицируется 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;
}