在团队中进行Nunit测试时,当前文化错误
-
12-10-2019 - |
题
我有一个依赖特定文化的单位测试。
在fixturesetup中,我设置了两个 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正在运行fixturesetup和单位测试,或者以某种方式修改 CurrentUICulture
.
两者都设置 CurrentUICulture
和 CurrentCulture
在 SetUp
(代替 FixtureSetup
)解决了问题。
从Nunit 2.4.2开始,您可以使用SetUlture属性。
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;
}
不隶属于 StackOverflow