NUnit 运行 BeforeTest 中的 TestActionAttribute 可以在夹具自己的 SetUp 方法之前吗?

Can a TestActionAttribute in NUnit run BeforeTest before the fixture's own SetUp method?

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

public class MyFixture {

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

    [Test, Rollback]
    public void DoTest() {
        // Tests with the data
    }
}

我的新 NUnit Rollback 属性看起来有点像这样:

public class RollbackAttribute : TestActionAttribute
{
    public override void BeforeTest(TestDetails testDetails)
    {
        // Begin transaction
    }

    public override void AfterTest(TestDetails testDetails)
    {
        // Abort transaction
    }
}

回滚应该回滚在 SetUp 方法中添加的新数据以及测试本身期间的任何修改。不幸的是,似乎 NUnit 的 BeforeTest 运行s 在 fixture 的 SetUp 方法之后,所以在 SetUp 期间添加的数据没有回滚。

有没有办法在 SetUp 之前 运行 BeforeTest?

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

Is there a way to run BeforeTest before SetUp?

我不这么认为,例如this related discussion on google groups。那里正在讨论的问题非常相似,如您所见,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_s在中提出的问题。问题与你的问题无关,但他使用了与我上面提出的相同的结构,所以这可能不是 那个 坏主意。

编辑:

Here 是 NUnit github 上未解决的问题。但是,请求的顺序仍然是:

BeforeTest (BaseFixture)
BaseSetUp BeforeTest (Fixture)
SetUp
BeforeTest (Test)
Test AfterTest (Test)
TearDown AfterTest (Fixture)
BaseTearDown AfterTest (BaseFixture)

所以不完全是你想要的,"BeforeTest (Test)" 将在 SetUp 之后执行。