如何设置单个MSTest测试方法的区域性
本文关键字:MSTest 测试方法 区域性 单个 何设置 设置 | 更新日期: 2023-09-27 18:11:08
最近发现了一个错误,这是由于在将文本解析为数字时没有指定InvariantCulture
而导致的,我想加强我们的单元测试,以便它们能够捕捉到这个问题。我编写了一个新测试,将当前区域性更改为具有不同数字格式的区域性,重新运行现有的一个测试方法,然后将区域性设置回来。不幸的是,文化的变化也影响了其他测试方法。是否有一种方法可以做到这一点,使测试不相互作用?
我确实发现,将区域性设置测试放在文件的最后将"解决"问题,但我讨厌依赖测试排序,因为它不能保证。在下面的例子中,如果系统文化为"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);
}
}
[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;
}
对TestMethod1
的德语调用失败,这导致重置区域性的行永远不会执行。把这行放到finally块中,测试应该按预期执行:
var originalCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
try
{
TestMethod1();
}
finally
{
Thread.CurrentThread.CurrentCulture = originalCulture;
}