NUnit и [SetUp] в базовых классах
Я смотрю на некоторый тестовый код, используя 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], который гарантирует, что один будет вызываться перед другим?
Ответы
Ответ 1
У вас может быть только один метод 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 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
}
Ответ 2
До 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 не может гарантировать порядок выполнения.
Подробнее см. здесь.
Ответ 3
Конструкторы - ваши друзья.
Если вы хотите поведение аддитивной установки - используйте конструкторы, поскольку их синтаксис более интуитивно понятен для этого.
Кроме того, вы должны также рассмотреть обоснование в http://jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html