如何为单个 MSTest 测试方法设置区域性?
How can I set the culture for individual MSTest test method(s)?
最近发现一个错误是由于在将文本解析为数字时未指定 InvariantCulture
,我想加强我们的单元测试,以便他们能够发现问题。我编写了一个新测试,将当前区域性更改为具有不同数字格式的区域性,重新 运行 一种现有测试方法,然后将区域性设置回去。不幸的是,文化变革也影响了其他测试方法。有没有办法让测试不交互?
我确实发现将文化设置测试放在文件的最后会 "solve" 问题,但我讨厌依赖测试顺序,因为它不是 gua运行teed。
在下面的示例中,对于 "en-EN"
的系统文化,如果 运行 本身,TestMethod1
和 TestMethod2
将成功。如果我 运行 所有的方法放在一起,它们都会失败。
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethodGerman()
{
var originalCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
TestMethod1();
Thread.CurrentThread.CurrentCulture = originalCulture;
}
[TestMethod]
public void TestMethod1()
{
double value = Double.Parse("3.00");
Assert.AreEqual(value, 3.0);
}
[TestMethod]
public void TestMethod2()
{
double value = Double.Parse("4.00");
Assert.AreEqual(value, 4.0);
}
}
德语对 TestMethod1
的调用失败,这导致重置区域性的行永远不会执行。将该行放在 finally 块中,测试应按预期执行:
var originalCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
try
{
TestMethod1();
}
finally
{
Thread.CurrentThread.CurrentCulture = originalCulture;
}
[TestMethod]
public void FooTest()
{
var foo = new Foo();
var actual = ExecuteWithCulture(() => foo.Bar(), "en-US");
}
private T ExecuteWithCulture<T>(Func<T> methodFunc, string cultureName)
{
T result = default(T);
var thread = new Thread(() =>
{
result = methodFunc();
});
thread.CurrentCulture = new CultureInfo(cultureName);
thread.Start();
thread.Join();
return result;
}
最近发现一个错误是由于在将文本解析为数字时未指定 InvariantCulture
,我想加强我们的单元测试,以便他们能够发现问题。我编写了一个新测试,将当前区域性更改为具有不同数字格式的区域性,重新 运行 一种现有测试方法,然后将区域性设置回去。不幸的是,文化变革也影响了其他测试方法。有没有办法让测试不交互?
我确实发现将文化设置测试放在文件的最后会 "solve" 问题,但我讨厌依赖测试顺序,因为它不是 gua运行teed。
在下面的示例中,对于 "en-EN"
的系统文化,如果 运行 本身,TestMethod1
和 TestMethod2
将成功。如果我 运行 所有的方法放在一起,它们都会失败。
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethodGerman()
{
var originalCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
TestMethod1();
Thread.CurrentThread.CurrentCulture = originalCulture;
}
[TestMethod]
public void TestMethod1()
{
double value = Double.Parse("3.00");
Assert.AreEqual(value, 3.0);
}
[TestMethod]
public void TestMethod2()
{
double value = Double.Parse("4.00");
Assert.AreEqual(value, 4.0);
}
}
德语对 TestMethod1
的调用失败,这导致重置区域性的行永远不会执行。将该行放在 finally 块中,测试应按预期执行:
var originalCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
try
{
TestMethod1();
}
finally
{
Thread.CurrentThread.CurrentCulture = originalCulture;
}
[TestMethod]
public void FooTest()
{
var foo = new Foo();
var actual = ExecuteWithCulture(() => foo.Bar(), "en-US");
}
private T ExecuteWithCulture<T>(Func<T> methodFunc, string cultureName)
{
T result = default(T);
var thread = new Thread(() =>
{
result = methodFunc();
});
thread.CurrentCulture = new CultureInfo(cultureName);
thread.Start();
thread.Join();
return result;
}