NUnit中的TestActionAttribute能否在fixture';之前运行;您自己的设置方法?

NUnit中的TestActionAttribute能否在fixture';之前运行;您自己的设置方法?,nunit,mbunit,Nunit,Mbunit,我有一些旧的MbUnit代码,如下所示: public class MyFixture { [SetUp] public void SetUp() { // Add data to database } [Test, Rollback] public void DoTest() { // Tests with the data } } public class RollbackAttribute : TestA

我有一些旧的MbUnit代码,如下所示:

public class MyFixture {

    [SetUp]
    public void SetUp() {
        // Add data to database
    }

    [Test, Rollback]
    public void DoTest() {
        // Tests with the data
    }
}
public class RollbackAttribute : TestActionAttribute
{
    public override void BeforeTest(TestDetails testDetails)
    {
        // Begin transaction
    }

    public override void AfterTest(TestDetails testDetails)
    {
        // Abort transaction
    }
}
我的新NUnit回滚属性看起来有点像这样:

public class MyFixture {

    [SetUp]
    public void SetUp() {
        // Add data to database
    }

    [Test, Rollback]
    public void DoTest() {
        // Tests with the data
    }
}
public class RollbackAttribute : TestActionAttribute
{
    public override void BeforeTest(TestDetails testDetails)
    {
        // Begin transaction
    }

    public override void AfterTest(TestDetails testDetails)
    {
        // Abort transaction
    }
}
回滚应该回滚在设置方法中添加的新数据以及测试过程中的任何修改。不幸的是,NUnit的BeforeTest似乎在fixture的安装方法之后运行,因此在安装过程中添加的数据不会回滚

是否有一种在安装前运行BeforeTest的方法

一个选项是基类,并在SetUp和TearDown中用额外的代码替换现有的回滚属性,但是我的一些测试需要在事务之外运行(它们在测试运行期间自己创建多个事务),因此在所有测试用例周围添加事务需要一些小心。我宁愿找到一个可以重用现有回滚属性的解决方案

是否有一种在安装前运行BeforeTest的方法

我不这么认为,见例。这里讨论的问题非常相似,正如您所看到的,
SetUp
方法中的代码甚至会在测试夹具级别上使用的
BeforeTest
方法之前运行(您在测试级别上有它)

从我的观点来看,解决方法是从
SetUp
方法中删除
SetUpAttribute
,并在每次测试开始时显式调用
SetUp
方法,即:

public class MyFixture
{
    public void SetUp()
    {
        // Add data to database
    }

    [Test, Rollback]
    public void DoTest()
    {
        SetUp();

        // Tests with the data
    }
}
你的问题也让我想起了marc_在年提出的问题。这个问题和你们的问题无关,但他使用了和我上面建议的相同的结构,所以这也许不是个坏主意

编辑:

是NUnit github上的公开发行版。但要求的订单仍然有:

测试前(基础夹具)
测试前的基本设置(夹具)
设置
测试前(测试)
测试后测试(测试)
拆卸后测试(夹具)
底座拆卸后测试(底座夹具)


因此,“BeforeTest(Test)”并不完全符合您的要求。是的,我认为我正在重构的初始实现有点落后-每个装置的设置方法不应该依赖于每个测试属性来确保其状态得到正确清理,所以必须改变这一点是完全合理的,没有任何联系。一旦我完成了我自己的工作,并得出结论,这个答案对我有效,我就会奖励奖金。@Puppy啊,我明白了,谢谢,我还以为你们两个是同事呢。