SetUp в производных классах с NUnit? - PullRequest
7 голосов
/ 14 февраля 2009

Если у меня есть следующий код:

[TestFixture]
public class MyBaseTest
{
    protected ISessionManager _sessionManager;

    [SetUp]
    public void SetUp() { /* some code that initializes _sessionManager */ }
}

[TestFixture]
public class MyDerivedTest : MyBaseTest
{
    IBlogRepository _repository;

    [SetUp]
    public void SetUp() { /* some code that initializes _repository */ }

    [Test]
    public void BlogRepository_TestGoesHere() { /* some tests */ }
}

... NUnit не вызывает базовую процедуру SetUp. Это ожидаемо, и у меня нет проблем с этим само по себе. Я могу заставить производный SetUp сначала вызвать базовый SetUp, например:

[TestFixture]
public class MyDerivedTest : MyBaseTest
{
    IBlogRepository _repository;

    [SetUp]
    public new void SetUp()
    {
        base.SetUp();
        /* some code that initializes _repository */
    }

Это безобразно. Если бы это был конструктор, мне бы не пришлось.

Я мог бы использовать шаблон «шаблонный метод» и получить следующее:

public void MyBaseTest
{
    abstract void SetUp();

    [SetUp]
    public void BaseSetUp()
    {
        /* base initialization */
        SetUp(); // virtual call
    }
}

Мне это тоже не особо нравится.

Что вы делаете, когда их тестовые классы нуждаются в SetUp, а они получены из другого класса, который также требует SetUp?

Ответы [ 5 ]

9 голосов
/ 14 февраля 2009

Вы должны вызвать метод напрямую.

   [SetUp]
   public void DerivedSetUp()
   {
      base.BaseSetUp();
      // Do something else
   }

Редактировать: я не пробовал, но, возможно, частичный метод тоже может сработать. Я бы предпочел сделать все выше.

Edit2: я только что пытался использовать частичные методы. Это не сработало. Даже если это произойдет, я думаю, что базовый класс все равно будет проще назвать.

3 голосов
/ 14 февраля 2009

У вас есть базовый класс явно. Учитывая, что NUnit использует атрибут [Setup] для разметки настроек теста, я думаю, что это «правильная вещь», которую нужно сделать для NUnit, поскольку она следует обычным языковым правилам.

Конечно, NUnit может выполнять поиск в базовых классах и автоматически вызывать их функции Setup, но я думаю, что это было бы довольно удивительно для большинства людей.

Однако существует по крайней мере одна инфраструктура модульного тестирования, в которой для настройки используются конструкторы: xUnit.Net . Здесь настройка базового класса вызывается автоматически, потому что так ведут себя конструкторы в C #.

(Обратите внимание, что xUnit.Net рекомендует снова использовать настройку теста.)

1 голос
/ 20 апреля 2011

Похоже, вы хотите, чтобы установка запускалась один раз перед началом любого тестирования, а не один раз перед каждым тестом. Аннотация [SetUp] заставляет метод запускаться один раз перед каждым тестом в вашем приборе. [SetUp] не наследуется.

Аннотацией, которую вы хотите использовать, является [TestFixtureSetUp], который запускается только один раз, перед тем, как будет выполнен любой из тестов в приборе. Это наследуется так, как вы ожидаете. :)

См. документы TextFixtureSetUp

0 голосов
/ 15 февраля 2009

Подход, который я использовал в TDD FireStarter в Тампе, заключался в том, чтобы иметь метод настройки в базовом классе, а затем использовать виртуальный метод в базовом классе, который называется наблюдением. Затем этот метод вызывается в базовом классе в конце метода установки.

Тогда, что вы делаете в новом классе, производном от базового класса, вы переопределяете метод наблюдения. Хитрость в этом сценарии заключается в том, что вы хотите выполнить метод Setup базового класса, а у дочернего класса нет метода Setup. Причина этого в том, что код, который вы используете в методе наблюдения, - это только те дополнительные вещи, которые вам нужны для дочернего тестового класса.

Этот подход хорошо работает для меня, но одна хитрость заключается в том, что бегущий по тестам захочет выполнить тесты базового класса, поэтому я пытаюсь обойти это, переместив Тесты из базового класса в новый класс, производный с базы, если у меня есть.

0 голосов
/ 14 февраля 2009

Следующие работы в MbUnit. Это может работать и в NUnit.

[TestFixture]
public abstract class Base {
    [SetUp]
    public virtual void SetUp() {
        //Some stuff.
    }
}

public class Derived : Base {
    public override void SetUp() {
        base.SetUp();
        //Some more stuff.
    }
    [Test]
    public virtual void Object_WhenInACertainState_WhenAMethodIsCalled_Throws() {
        //Create and set state on the object.
        //Call the method.
        //Assert the method threw.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...