最近发现一个错误是因为在将文本解析为数字时没有指定"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);
}
}
如果自己运行则会成功。如果我一起运行所有方法,它们都会失败。
{{1}}
答案 0 :(得分:2)
[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;
}
答案 1 :(得分:0)
德国对TestMethod1
的调用失败,导致重置文化的行永远不会被执行。将该行放在finally块中,测试应按预期执行:
var originalCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
try
{
TestMethod1();
}
finally
{
Thread.CurrentThread.CurrentCulture = originalCulture;
}