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

本文关键字:MSTest 测试方法 区域性 单个 何设置 设置 | 更新日期: 2023-09-27 18:11:08

最近发现了一个错误,这是由于在将文本解析为数字时没有指定InvariantCulture而导致的,我想加强我们的单元测试,以便它们能够捕捉到这个问题。我编写了一个新测试,将当前区域性更改为具有不同数字格式的区域性,重新运行现有的一个测试方法,然后将区域性设置回来。不幸的是,文化的变化也影响了其他测试方法。是否有一种方法可以做到这一点,使测试不相互作用?
我确实发现,将区域性设置测试放在文件的最后将"解决"问题,但我讨厌依赖测试排序,因为它不能保证。在下面的例子中,如果系统文化为"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);
      }
   }

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

[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;
}