2010-05-09 204 views
0

我正在运行一些需要连接到数据库的单元测试。当我的测试项目被初始化时,会创建数据库的快照,当测试完成时,数据库会恢复到快照。AssemblyCleanup()测试失败/异常

下面是执行:

[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当然不会被调用,那么我该如何解决这个问题呢?无论发生什么情况,快照都必须恢复。这可能吗?

+0

在单元测试中,您可以添加将在测试完成时执行的代码。也许看那里? :) – 2010-05-09 14:39:57

+0

@Oskar我可以做什么“大会集会”吗?否则,我必须为所有测试做到这一点。这是可能的,但我希望更好的解决方案。 – 2010-05-09 15:17:25

+0

我是单元测试新手,但我认为在单元测试中使用db并不是最佳做法。 http://en.wikipedia.org/wiki/Mock_object – anilca 2010-05-09 15:22:34

回答

0

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

+0

你说得对。也许我应该花更多的时间来模拟ObjectContext。 – 2010-05-10 21:05:17

-2

你认为AssemblyCleanup不会被调用是错误的。除非有人可能“跳过电源线”(如Hans所述),TestCleanup,ClassCleanup和AssemblyCleanup都会执行,无论是否存在异常(或测试失败)。

请注意,只要您的测试(或测试中的代码)没有产生可能会抛出异常的新线程,就是如此。底线:汉斯解决方案更加强大,但对于大多数情况,我发现AssemblyCleanup足够好,更直接。

+2

这是错误的。如果存在未处理的异常,则不会调用“AssemblyCleanup”。请参阅http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.assemblycleanupattribute.aspx – CookieMonster 2014-12-11 14:03:32

+1

我很惊讶地看到文档中的这句话,但它或者是错误的,或者我们都不'不明白它究竟是指什么(我刚刚测试过!)。唯一不会被调用的情况是[AssemblyInitialize]方法内有异常。另外,请参阅[我的博客文章](http://blogs.microsoft.co.il/arnona/2014/09/02/right-way-test-cleanup/)了解我的建议处理清理。 – 2015-05-11 18:34:33