не работает установка монтировки? - PullRequest
3 голосов
/ 24 февраля 2009

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

[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*/);
    }
}

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

edit> Точный код:

[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 ]

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

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

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

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

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

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

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

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

2 голосов
/ 20 января 2013

У меня была точно такая же проблема, поэтому я извиняюсь за ответ на этот старый пост. Проблема в вашем коде (и моем) заключается в том, что вы создаете 2 разных экземпляра для MoneyBox и еще 2 для TextBox. Таким образом, первоначальное назначение внутри программы установки действительно только для метода установки и 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...