如何为单个MSTest测试方法设置文化?

时间:2015-09-03 18:21:35

标签: c# unit-testing mstest cultureinfo

最近发现一个错误是因为在将文本解析为数字时没有指定"en-EN",我想加强我们的单元测试,以便他们能够解决问题。我编写了一个新测试,将当前文化更改为具有不同数字格式的文化,重新运行现有测试方法之一,然后重新设置文化。不幸的是,文化变革也影响了其他测试方法。有没有办法做到这一点,使测试不相互作用? 我确实发现将文化设置测试放在文件中最后会“解决”问题,但我讨厌依赖测试排序,因为它不能保证。 在以下示例中,系统文化为TestMethod1TestMethod2 [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}}

2 个答案:

答案 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;
}