2009-02-24 7 views
3

Хорошо, у меня странная проблема. Я тестирует UserControl и иметь такой код:nunit setup/teardown не работает?

[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. Я также добавил конструктор и деконструктор и вывел на консоль все различные этапы, чтобы увидеть последовательность событий. Тем не менее, я никогда не получал исключение ссылки на объект.

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

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

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

+0

! Я понял. Я очень ценю ваш вклад. Проблема заключалась в том, что я повторно объявлял moneybox/textbox в настройке (в отличие от JUST newing). –

+1

@SnOrfus: Это легко сделать, если вы рекламируете локальный объект для объекта класса.По иронии судьбы, вы поняли это в своем псевдокоде. – Autodidact

3

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

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

2

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

Только для тех, кто может понадобиться снова

Смежные вопросы