代码之家  ›  专栏  ›  技术社区  ›  Tommy Jakobsen

测试失败/异常后的assemblyCleanup()

  •  0
  • Tommy Jakobsen  · 技术社区  · 14 年前

    我正在运行一些需要连接到数据库的单元测试。当我的测试项目初始化时,将创建数据库的快照,当测试完成时,数据库将还原回快照。

    以下是实现方法:

    [TestClass]
    public static class AssemblyInitializer
    {
        [AssemblyInitialize()]
        public static void AssemblyInit(TestContext context)
        {
            var dbss = new DatabaseSnapshot(...);    
            dbss.CreateSnapshot();
        }
    
        [AssemblyCleanup()]
        public static void AssemblyCleanup()
        {
            var dbss = new DatabaseSnapshot(...);
            dbss.RevertDatabase();
        }
    }
    

    现在这一切都起作用了,但是当我有一个失败的测试或一些异常时,我的问题就出现了。当然不会调用AssemblyCleanup,所以如何解决此问题?无论发生什么,都必须还原快照。这可能吗?

    2 回复  |  直到 14 年前
        1
  •  0
  •   Hans Passant    14 年前

    是的,不要这样做。有人可能会绊倒电源线。始终复制数据库文件的已知良好副本并附加它们。在文档中查找使用如何附加的dbase引擎。

        2
  •  -1
  •   Arnon Axelrod    10 年前

    您认为不会调用AssemblyCleanup的假设是错误的。除非有人可能“绊倒电源线”(正如hans在上面建议的那样),否则testcleanup、classcleanup和assemblycleanup都将执行,而不管是否有异常(或测试失败)。

    请注意,只要您的测试(或测试中的代码)没有生成可能引发异常的新线程,这是正确的。

    一句话:汉斯的解决方案是坚不可摧的,但在大多数情况下,我发现汇编清理已经足够好了,而且更加直截了当。