Установка / разборка nunit не работает?

Хорошо, у меня странная проблема. Я тестирую пользовательский элемент управления и имею такой код:

[TestFixture]
public myTestClass : UserControl
{
    MyControl m_Control;

    [Test]
    public void TestMyControl()
    {
        m_Control = new MyControl();
        this.Controls.Add(m_Control);

        Assert.That(/*SomethingOrOther*/)
    }
}

Это нормально работает, но когда я меняю его на:

[TestFixture]
public myTestClass : UserControl
{
    MyControl m_Control;

    [Setup]
    public void Setup()
    {
        m_Control = new MyControl();
        this.Controls.Add(m_Control);
    }

    [TearDown]
    public void TearDown()
    {
        this.Controls.Clear();
    }

    [Test]
    public void TestMyControl()
    {
        Assert.That(/*SomethingOrOther*/);
    }
}

Я получаю ссылку на объект, не относящуюся к экземпляру объекта. Я даже выводил на консоль, чтобы убедиться, что установка / разборка выполнялась в правильное время, и они были ... но все же это не нововведение в пользовательских элементах управления.

редактировать> Точный код:

[TestFixture]
public class MoneyBoxTests : UserControl
{
    private MoneyBox m_MoneyBox;
    private TextBox m_TextBox;

    #region "Setup/TearDown"
    [SetUp]
    public void Setup()
    {
        MoneyBox m_MoneyBox = new MoneyBox();
        TextBox m_TextBox = new TextBox();

        this.Controls.Add(m_MoneyBox);
        this.Controls.Add(m_TextBox);
    }

    [TearDown]
    public void TearDown()
    {
        this.Controls.Clear();
    }
    #endregion

    [Test]
    public void AmountConvertsToDollarsOnLeave()
    {
        m_MoneyBox.Focus();
        m_MoneyBox.Text = "100";
        m_TextBox.Focus();

        Assert.That(m_MoneyBox.Text, Is.EqualTo("$100.00"), "Text isn't $100.00");
    }

    [Test]
    public void AmountStaysANumberAfterConvertToDollars()
    {
        m_MoneyBox.Focus();
        m_MoneyBox.Text = "100";
        m_TextBox.Focus();

        Assert.That(m_MoneyBox.Amount, Is.EqualTo(100), "Amount isn't 100");
    }
}

Я получаю исключения при соответствующих вызовах m_MoneyBox.Focus ().

Решено - см. Комментарии Джозефа

Ответов (3)

Решение

Я создал тестовый пример с точно таким же макетом, который вы представили здесь, но с TextBox вместо MyControl. Я также добавил конструктор и деконструктор и вывел все этапы на консоль, чтобы увидеть последовательность событий. Однако я никогда не получал исключения ссылки на объект.

Если вам интересно, последовательность была [вызов конструктора], [вызов установки], [вызов теста], [вызов удаления]. Деконструкция почему-то никогда ничего не выводит на экран.

Моя первоначальная мысль заключалась в том, что свойство Controls в myTestClass не будет инициализировано, но в моем тесте это было так, поэтому я думаю, что это как-то связано с вашей конструкцией MyControl.

edit> Я также добавил фокус на свой TextBox в модульном тесте, но все же не исключение. Есть ли в вашем MoneyBox какая-либо обработка событий за кулисами во время Focus? Это может быть вашим виновником.

У меня была точно такая же проблема, поэтому приношу свои извинения за ответ на этот старый пост. Проблема в вашем (и моем) коде заключается в том, что вы создаете 2 разных экземпляра для MoneyBox и еще 2 для TextBox. Таким образом, первоначальное назначение внутри Setup действительно только для метода Setup и out_of_scope в методах тестирования.

Внутри метода установки вы должны использовать:

m_MoneyBox = new MoneyBox(); //GOOD
m_TextBox = new TextBox();  //GOOD

вместо того

MoneyBox m_MoneyBox = new MoneyBox();  //BAD
TextBox m_TextBox = new TextBox();  //BAD

Просто для тех, кому это снова может понадобиться

Вы не сказали, где возникает исключение, что поможет - как выглядит трассировка стека?

Очень странно (IME) быть производным от UserControl при создании тестового устройства. Помимо всего прочего, я не знаю, будет ли NUnit вызывать для вас Dispose в любой подходящий момент ... какова его цель? Разве вы не можете запустить свои тесты с помощью "простого" тестового прибора?