Подтвердить что ты не робот

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], который гарантирует, что один будет вызываться перед другим?

4b9b3361

Ответ 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