基类中的NUnit和[SetUp]

时间:2013-07-15 16:34:26

标签: c# nunit

我正在使用NUnit查看一些测试代码,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]属性是否有特殊功能可以确保在另一个之前调用一个?

2 个答案:

答案 0 :(得分:58)

在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无法保证执行顺序。

See here for further information

答案 1 :(得分:28)

您只能使用一种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
}