如何为单个 MSTest 测试方法设置区域性?

How can I set the culture for individual MSTest test method(s)?

最近发现一个错误是由于在将文本解析为数字时未指定 InvariantCulture,我想加强我们的单元测试,以便他们能够发现问题。我编写了一个新测试,将当前区域性更改为具有不同数字格式的区域性,重新 运行 一种现有测试方法,然后将区域性设置回去。不幸的是,文化变革也影响了其他测试方法。有没有办法让测试不交互?
我确实发现将文化设置测试放在文件的最后会 "solve" 问题,但我讨厌依赖测试顺序,因为它不是 gua运行teed。 在下面的示例中,对于 "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);
      }
   }

德语对 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;
}