NUnit中的TestActionAttribute是否可以在fixture自己的SetUp方法之前运行BeforeTest?

问题描述:

我有一些老MbUnit的代码看起来像这样:NUnit中的TestActionAttribute是否可以在fixture自己的SetUp方法之前运行BeforeTest?

public class MyFixture { 

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

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

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

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

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

回滚应该回退在设置中添加新的数据方法以及测试过程中的任何修改。不幸的是,似乎NUnit的BeforeTest在灯具的SetUp方法后运行,所以在SetUp期间添加的数据不会回滚。

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

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

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

我不这么认为。 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在this SO thread中提出。问题与你的问题无关,但他使用了与我上面提出的相同的构造,所以它可能不是不好主意。

编辑:

Here是NUnit的的github上打开的问题。但尽管如此,请求的订单有:

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

所以不是你想要的,“BeforeTest(Test)”会被执行d在SetUp之后。

+0

是的,我认为我重构的初始实现有点倒退 - 每个fixture的SetUp方法不应该依赖per-test属性来确保它的状态被正确清理,所以它完全是合理的,必须改变这一点。 – Douglas

+0

没有从属关系。一旦我完成我自己的东西,我会奖励赏金,并得出这个答案适合我的结论。 – Puppy

+0

@Puppy啊,我明白了,谢谢,我以为你们两个都是同事。 –