我有一个依赖特定文化的单位测试。

在fixturesetup中,我设置了两个 Thread.CurrentThread.CurrentCultureThread.CurrentThread.CurrentUICulture 到所需的值(EN-US)。

当我从Resharper进行测试时,它会通过。

当我从TeamCity(使用跑步者“ Nunit 2.4.6”)中进行测试时,测试失败了,因为CurrentCulturecs-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.

两者都设置 CurrentUICultureCurrentCultureSetUp (代替 FixtureSetup)解决了问题。

从Nunit 2.4.2开始,您可以使用SetUlture属性。

namespace NUnit.Tests
{
  using System;
  using NUnit.Framework;

  [TestFixture]
  [SetCulture("fr-FR")]
  public class FrenchCultureTests
  {
    // ...
  }
}

该示例是从下面的链接中获取的。请参考链接以获取更多详细信息。

https://github.com/nunit/docs/wiki/setculture-attribute

在我的测试中,我在单个测试方法中设置并重置当前文化

      

            var tempCurrentUICulture = Thread.CurrentThread.CurrentUICulture;
            try
            {
                Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-HK" );
                 actual = target.MethodToTest(resourceSet, localeId);
            }
            finally
            {
                Thread.CurrentThread.CurrentUICulture = tempCurrentUICulture;
            }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top