在NUnit中捕获断言失败的正确方法

时间:2010-07-28 13:17:57

标签: c# nunit assert

我正在为我的数据库编写集成测试,我有一个问题。在测试方法的开头我将一些对象添加到数据库中,在方法的最后我应该删除它。

所以我有一个代码:

var group = new ContactGroup { Name = UserLogin + "_test_group" };
group.ID = _provider.AddGroup(UserLogin, group);
Assert.That(_provider.GetGroup(UserLogin, group.ID), Is.Not.Null);
_provider.RemoveGroup(UserLogin, group.ID);

关键是如果断言失败,则不会执行RemoveGroup。我该怎么办呢?

如果我试试这个:

var group = new ContactGroup { Name = UserLogin + "_test_group" };
group.ID = _provider.AddGroup(UserLogin, group);
try
{
    Assert.That(_provider.GetGroup(UserLogin, group.ID), Is.Not.Null);
}
finally
{
    _provider.RemoveGroup(UserLogin, group.ID);
}

我应该像这样重新抛出AssertionException

catch (AssertionException)
{
    throw;
}

4 个答案:

答案 0 :(得分:4)

在数据库集成测试中处理清理的一种方法是在事务中执行测试,然后在测试完成后回滚。

答案 1 :(得分:1)

使用拆卸方法。每次测试后立即执行拆卸方法。

   [TearDown]
    public void TearDown()
    {
       _provider.RemoveGroup(UserLogin, group.ID);
    }

答案 2 :(得分:0)

DBUnit人员建议在启动时销毁而不是关闭(Good setup don't need cleanup!),这就是我的工作。因此,测试的开始将删除测试不期望的任何数据。

答案 3 :(得分:0)

根本不需要catch条款。在C#中,try {... throw ...} finally {...}将执行finally子句,然后将堆栈中的异常发送到最近的catch,如果没有,则从程序的顶部发送。因此

try {
    Assert.Fail("BOOM!");
} finally {
    Cleanup();
}

将完全按照您的意愿执行:运行Cleanup()然后从断言中死掉。