14

我在 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
    }

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

理想情况下,我只想为我的单元测试的一小部分指定这种行为,这样我就不必为不关心全局状态的测试(绝大多数我的测试)。

4

4 回答 4

7

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

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

我继续欢迎任何进一步的想法,特别是如果我遗漏了有关 MSTEST 的一些明显内容。

于 2008-10-13T17:24:49.357 回答
6

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

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

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

于 2008-10-13T18:36:08.043 回答
2

我认为您正在寻找 TestIntialize 属性和 TestCleanUp 属性。这是一个显示执行顺序链接文本的 MSDN 博客

于 2008-10-13T15:14:39.040 回答
1

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

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

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

于 2008-10-13T15:07:34.423 回答