【发布时间】:2011-02-15 08:14:13
【问题描述】:
如何在 VS2008 中为 C# 中的测试项目指定具体的本地化文化?我正在构建在 web.config 中指定了非标准文化的 Asp .Net MVC 应用程序,但是如何为该项目的单元测试设置相同的文化?
【问题讨论】:
标签: c# unit-testing localization locale
如何在 VS2008 中为 C# 中的测试项目指定具体的本地化文化?我正在构建在 web.config 中指定了非标准文化的 Asp .Net MVC 应用程序,但是如何为该项目的单元测试设置相同的文化?
【问题讨论】:
标签: c# unit-testing localization locale
你可以设置
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
在单元测试框架中标记为“测试初始化程序”的方法中。
【讨论】:
Thread.CurrentThread.CurrentUICulture 而不是 CurrentCulture。 CurrentUICulture 的 Intellisense 本身显示 Gets or sets the current culture used by the Resource Manager to look up culture-specific resources at run time. 我的测试在使用 CurrentCulture 对“fr-FR”文化资源进行测试时失败,但在使用 CurrentUICulture 时通过。
CultureInfo 参考——我在质疑它是否应该是CurrentUICulture 而不是CurrentCulture
如果您使用的是 xUnit,您可以将 UseCultureAttribute 添加到您的项目中,如下所述:
https://github.com/xunit/samples.xunit/blob/master/UseCulture/UseCultureAttribute.cs
使用它:
[Fact]
[UseCulture("en-US")]
public void MyTest()
{
// ...
}
【讨论】:
UseCultureAttribute 时,您的意思是将整个文件复制到您的项目中?因为它似乎不包含在核心 nuget github.com/xunit/xunit/issues/290 中,并且永远不会包含。
BeforeAfterTestAttribute 的一个示例,它是 xUnit 的一部分。
如果您想为整个测试套件指定CultureInfo,而不必将其添加到每个TestClass 的TestInitializer,您可以使用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");
}
}
【讨论】:
对于 nUnit 3,您可以使用属性 [SetUICulture("en-us")]。
这将强制这个单一测试的文化。
【讨论】:
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-US");
System.Threading.Thread.CurrentThread.CurrentCulture = ci;
【讨论】:
以下方法对我有用:
[TestClass]
public class MyTestClass
{
[TestInitialize]
public void InitializeTestClass()
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}
.......... [other unit tests]
}
【讨论】:
没有类似于 web.config 中的设置适用于您的情况。
您可以尝试按照此处其他答案的建议为每个线程设置它。
或者,如果您使用的是在 VS.NET 中创建的资源,代码生成会在名为“Culture”的资源类上创建一个静态属性。您可以在单元测试的套件启动方法中设置它。这将适用于您运行的所有测试。
【讨论】: