Reputation: 16299
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?
Upvotes: 52
Views: 27259
Reputation: 5824
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.
Upvotes: 90
Reputation: 141588
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.
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
}
Upvotes: 37