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

时间:2015-07-10 13:52:21

标签: nunit mbunit

我有一些旧的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
    }
}

Rollback应该回滚SetUp方法中添加的新数据以及测试期间的任何修改。不幸的是,似乎NUnit的BeforeTest在fixture的SetUp方法之后运行,因此在SetUp期间添加的数据不会回滚。

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

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

1 个答案:

答案 0 :(得分:4)

  

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

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

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

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

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

        // Tests with the data
    }
}

你的问题也让我想起了this SO thread中提到的marc_s的问题。问题与你的问题无关,但他使用了与我上面提出的相同的结构,所以它可能不是那个坏主意。

修改

Here是NUnit的github上一个已解决的问题。但仍然要求订单:

  

BeforeTest(BaseFixture)
  BaseSetUp BeforeTest(夹具)
  的SetUp
  BeforeTest(测试)
  测试AfterTest(测试)
  TearDown AfterTest(夹具)
  BaseTearDown AfterTest(BaseFixture)

所以不完全是你想要的,“之前的测试”将在SetUp之后执行。