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

C# 在NUnit中捕获断言失败的正确方法,c#,nunit,assert,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.N

我正在为我的数据库编写一个集成测试,我有一个问题。在测试方法开始时,我将向数据库添加一些对象,在方法结束时,我应该删除它

所以我有这样一个代码:

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);
}
我应该像这样重复断言异常吗

catch (AssertionException)
{
    throw;
}

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

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

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

DBUnit人员建议在启动时而不是关闭时进行销毁(),这就是我所做的。因此,测试的开始会删除测试不需要的任何数据。

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

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

将完全按照您的要求执行:运行
Cleanup()
,然后从断言中退出。

+1还有一个类fixture的分解,另一个名称空间的分解。我仅在选定的方法中创建此组。有没有其他方法来管理这个问题,因为我不想在我不需要的时候创建组(在每次测试之前)?该死,太简单了:)谢谢!