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

Jef*_*ser 13 c# unit-testing mstest appdomain visual-studio-2008

我在Visual Studio 2008中使用MSTEST.如何在某个测试类中使用每个单元测试方法,就好像它是第一个运行的测试,以便在运行每个测试之前重置所有全局状态?我不想使用TestInitialize,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
    }
Run Code Online (Sandbox Code Playgroud)

虽然在这个主题上出现了类似的问题,但它只是澄清了测试并不是并行运行的.我意识到测试是连续运行的,但似乎没有办法为每个方法显式强制新的AppDomain(或等同于清除所有状态的东西).

理想情况下,我只想为单元测试的一小部分指定此行为,这样我就不必为不关心全局状态的测试支付新AppDomain创建的代价(绝大多数我的测试).

Jef*_*ser 7

最后,我编写了一个使用AppDomain.CreateDomain的帮助器,然后使用反射在不同的AppDomain下调用单元测试.它提供了我需要的隔离.

MSDN论坛上的这篇文章展示了如果只有一些需要重置的静态的情况下如何处理这种情况.确实提到了一些选项(例如使用Reflection和PrivateType).

我继续欢迎任何进一步的想法,特别是如果我遗漏了一些关于MSTEST的明显事实.


Wat*_*son 6

在你的测试中添加一个帮助器,它使用反射来删除单例实例(你也可以在单例中添加一个重置方法,但我会担心它的用法).就像是:

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

在TestInitialize方法中调用它.[我知道这是"清理世界",但你只需要在每个单独的帮助器中编写一次这个方法,它非常简单并且可以让你明确控制]