46

我正在查看一些使用 NUnit 的测试代码,它继承自包含 [SetUp] 属性的基类:

public class BaseClass
{
   [SetUp]
   public void SetUp()
   {
     //do something
   }

}

[TestFixture]
public class DerivedClass : BaseClass
{
  [SetUp]
  public void SetUp()
  {

   //do something else, with no call to base.SetUp()
  }
   //tests run down here.
   //[Test]
   //[Test]
   //etc
}

派生类肯定需要在基类的 SetUp() 方法中完成的工作。

我是否遗漏了什么,或者在运行派生类的测试时不会调用基类中的 SetUp() 方法?[SetUp] 属性是否有什么特别之处可以确保先调用另一个?

4

2 回答 2

80

在 NUnit 2.5 之前,之前的答案是正确的;您只能有[SetUp]一个测试属性。

从 NUnit 2.5 开始,您可以拥有多个用该[SetUp]属性修饰的方法。因此,以下内容在 NUnit 2.5+ 中完全有效:

public abstract class BaseClass
{
    [SetUp]
    public void BaseSetUp()
    {
        Debug.WriteLine("BaseSetUp Called")
    }
}

[TestFixture]
public class DerivedClass : BaseClass
{
    [SetUp]
    public void DerivedSetup()
    {
        Debug.WriteLine("DerivedSetup Called")  
    }

    [Test]
    public void SampleTest()
    {
        /* Will output
         *    BaseSetUp Called
         *    DerivedSetup Called
        */
    }
}

当继承 NUnit 时,总是会首先运行基类中的 '[SetUp]' 方法。如果[SetUp]在一个类中声明了多个方法,NUnit 不能保证执行的顺序。

请参阅此处了解更多信息

于 2014-02-28T15:34:00.593 回答
37

你只能有一种SetUp方法。

一个 TestFixture 只能有一个 SetUp 方法。如果定义了多个,TestFixture 将成功编译,但其测试不会运行。

http://www.nunit.org/index.php?p=setup&r=2.2.10

如果您需要在子类中添加额外的设置逻辑,SetUp请在父类中标记为虚拟,覆盖它,base.SetUp()如果您希望基类的设置也运行,请调用。

public class BaseClass
{
   [SetUp]
   public virtual void SetUp()
   {
     //do something
   }

}



[TestFixture]
public class DerivedClass : BaseClass
{
  public override void SetUp()
  {
   base.SetUp(); //Call this when you want the parent class's SetUp to run, or omit it all together if you don't want it.
   //do something else, with no call to base.SetUp()
  }
   //tests run down here.
   //[Test]
   //[Test]
   //etc
}
于 2013-07-15T16:44:16.390 回答