NUnit and [SetUp] in base classes

I'm looking at some test code using NUnit, which inherits from a base class containing a [SetUp] attribute:

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
}

The derived class will certainly need the work done in the base class' SetUp() method.

Am I missing something, or will the SetUp() method in the base class not be called when the derived class's tests are run? Is there something special with the [SetUp] attribute that ensures one will be called before the other?

Answers


You can only have one SetUp method.

A TestFixture can have only one SetUp method. If more than one is defined the TestFixture will compile successfully, but its tests will not run.

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

If you need to add additional setup logic in a child class, mark SetUp as virtual in your parent class, override it, and call base.SetUp() if you want the base class's setup to run, too.

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
}

Before NUnit 2.5 the previous answers were correct; you could only have a single [SetUp] attribute for a test.

With NUnit 2.5 onwards you can have multiple methods decorated with the [SetUp] attribute. Therefore the below is perfectly valid in 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
        */
    }
}

When inheriting NUnit will always run the '[SetUp]' method in the base class first. If multiple [SetUp] methods are declared in a single class NUnit cannot guarantee the order of execution.

See here for further information.


Need Your Help

Get current stack trace in Ruby without raising an exception

ruby stack-trace

I want to log the current backtrace (stacktrace) in a Rails 3 app without an exception occurring. Any idea how?

Dismissing multiple modal view controllers at once?

iphone uiviewcontroller modal-dialog dismiss

So have a stack with three view controllers where A is root, B is first modal view controller and C is third modal vc. I would like to go from C to A at once. I have tried this solution to dismiss.It