代码之家  ›  专栏  ›  技术社区  ›  Jeff Moser

如何在运行之前强制MSTEST TESTMETHOD重置所有单例/静态?

  •  11
  • Jeff Moser  · 技术社区  · 16 年前

    我正在Visual Studio 2008中使用MSTest。如何让某个测试类中的每个单元测试方法充当第一个要运行的测试,以便在运行每个测试之前重置所有全局状态?我不想使用testinialize、classinitialize、assemblyinitialize等显式清理世界。例如:

    [TestClass]
    public class MyClassTests
    {
        [TestMethod]
        public void Test1()
        {
           // The "Instance" property creates a new instance of "SomeSingleton"
           // if it hasn't been created before.
           var i1 = SomeSingleton.Instance;
           ...
        }
        [TestMethod]
        public void Test2()
        {
           // When I select "Test1" and "Test2" to run, I'd like Test2
           // to have a new AppDomain feel so that the static variable inside
           // of "SomeSingleton" is reset (it was previously set in Test1) on
           // the call to ".Instance"
           var i2 = SomeSingleton.Instance;
           // some code
        }
    

    虽然A similar question 出现在这个主题上,它只澄清了测试不并行运行。我认识到测试是连续运行的,但是似乎没有一种方法可以为每个方法显式地强制一个新的AppDomain(或者类似于清除所有状态的方法)。

    理想情况下,我希望只为我的单元测试的一小部分指定这种行为,这样我就不必为不关心全局状态的测试(我的大多数测试)支付新AppDomain创建的惩罚。

    4 回复  |  直到 9 年前
        1
  •  7
  •   svick Raja Nadar    9 年前

    最后,我写了一个助手 AppDomain.CreateDomain 然后使用反射调用另一个AppDomain下的单元测试。它提供了我需要的隔离。

    This post 在msdn的论坛上展示了如果你只有一些需要重置的静态信息,如何处理这种情况。 It 是否提到了一些选项(例如使用反射和 PrivateType )

    我继续欢迎任何进一步的想法,特别是如果我错过了一些关于MSTEST的显而易见的东西。

        2
  •  5
  •   Watson    16 年前

    在测试中添加一个使用反射删除singleton实例的助手(您也可以向singleton添加一个reset方法,但我会关注它的使用)。比如:

    public static class SingletonHelper {
                public static void CleanDALFactory() 
                {
                        typeof(DalFactory)
                            .GetField("_instance",BindingFlags.Static | BindingFlags.NonPublic)
                            .SetValue(null, null);
                }
    }
    

    在TestInitialize方法中调用此函数。[我知道这是“清理世界”,但是您只需要在每个单独实例的助手中编写一次方法,这非常简单,并且给您明确的控制权]

        3
  •  2
  •   Alex    16 年前

    我认为您正在寻找testinialize属性和testcleanup属性。这是一个显示执行顺序的msdn日志 link text

        4
  •  1
  •   Jennifer    16 年前

    我们的MSTEST也出现了类似的问题。我们通过在需要它的特定测试的开始和结束时调用一个函数来处理它。

    我们将在应用程序配置中存储测试到期日期。三个测试需要这个日期进入一个特定的范围来确定合适的值。在应用程序的设置方式中,只有在会话中没有分配值的情况下才会重置配置值。因此,我们创建了两个新的私有静态函数——一个是显式地将配置值设置为指定的日期,另一个是在测试运行后从会话中清除该日期。在我们的三个测试中,我们称这两个函数。当下一个测试运行时,应用程序会看到日期的空值,并从配置文件中重新提取该值。

    我不确定这是否有帮助,但这就是我们解决类似问题的方法。