C#如何强制本地化文化进入测试项目的en-US

mga*_*mer 31 c# locale unit-testing localization

如何在VS2008中为C#中的测试项目指定concrente Localization Culture?我正在构建具有web.config中指定的非标准文化的Asp .Net MVC应用程序,但是如何为该项目的单元测试设置相同的文化?

小智 56

你可以设置

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); 
Run Code Online (Sandbox Code Playgroud)

在单元测试框架中标记为"test initializer"的方法中.

  • 我真的很担心挑战这样一个被赞成的答案,但我相信它应该是“Thread.CurrentThread.CurrentUICulture”而不是 CurrentCulture。CurrentUICulture 的 Intellisense 本身说“获取或设置资源管理器使用的当前区域性,以在运行时查找特定于区域性的资源。”当使用 CurrentCulture 对“fr-FR”区域性资源进行测试时,我的测试失败,但通过使用 CurrentUICulture 时。 (3认同)
  • 你可以在你要调用的方法之前设置它,你想拥有特定的文化,你不需要在测试设置中这样做.如果你只是需要为一次测试设置它,你可能不想这样做. (2认同)

Dre*_*kes 8

如果您正在使用xUnit,则可以将其添加UseCultureAttribute到项目中,如下所示:

https://github.com/xunit/samples.xunit/blob/master/UseCulture/UseCultureAttribute.cs

要使用它:

[Fact]
[UseCulture("en-US")]
public void MyTest()
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 对评论有点困惑,但是当您的意思是添加“UseCultureAttribute”时,您的意思是将整个文件复制到您的项目中吗?因为它似乎不包含在核心 nuget https://github.com/xunit/xunit/issues/290 中,并且永远不会包含在其中。 (2认同)
  • @ahong是的,您需要复制该属性的源代码。这是 `BeforeAfterTestAttribute` 的一个示例,它是 xUnit 的一部分。 (2认同)

Jon*_*yna 5

如果要指定CultureInfo为您的整个测试套件,而无需将其添加在TestInitializer每一个TestClass,你可以使用AssemblyInitializeAttribute

在测试类(用 属性修饰的类[TestClass])中,添加一个设置DefaultThreadCurrentCulture和的静态方法,DefaultThreadCurrentUICulture然后用 修饰该方法[AssemblyInitialize]

当您的测试套件启动时,此方法将在运行任何 TestMethods 之前运行一次。(注意:您的测试套件中可能只有一个使用此属性修饰的此类方法。)

这是一个使用专用测试类的示例,该类仅用于设置文化,但您可以将其放在任何测试类中:

[TestClass]
public static class InitializeCulture
{
    [AssemblyInitialize]
    public static void SetEnglishCultureOnAllUnitTest(TestContext context)
    {
        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
        Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 5

对于 nUnit 3,您可以使用属性[SetUICulture("en-us")]。这将强制此单个测试的文化。