2009-02-24 87 views
3

好吧,我有一個奇怪的問題。我正在測試一個用戶控件,並有這樣的代碼: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*/); 
    } 
} 

我得到一個對象引用不設置到對象的實例。我甚至輸出到控制檯,以確保安裝/拆卸在正確的時間運行,並且它們是...但仍然沒有新的usercontrols。

編輯>確切的代碼是:

[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除外(S)()調用。

解決 - 見約瑟夫的意見

回答

3

我創建了一個測試用例,其佈局與此處顯示的佈局完全相同,但使用的是TextBox而不是MyControl。我還添加了一個構造函數和一個解構器,並將所有各個階段輸出到控制檯以查看事件序列。但是,我從來沒有得到一個對象引用異常。

如果您有興趣,序列是[構造函數調用],[setup called],[測試調用],[tear down調用]。由於某種原因,解構並不會向屏幕輸出任何東西。

我原來的想法是myTestClass上的Controls屬性不會被初始化,但是在我的測試中它是這樣的,所以我認爲它與MyControl構造有關。

編輯>我在單元測試中加入了我的TextBox中的焦點,但仍然不例外。您的MoneyBox在聚焦期間是否在幕後進行任何事件處理?這可能是你的罪魁禍首。

+0

!我想到了。我非常感謝你的意見。問題是我重新在設置中聲明瞭moneybox/textbox(而不是JUST newing它)。 – 2009-02-24 16:50:14

3

你還沒說你在哪裏得到的例外,這將有助於 - 它的堆棧跟蹤是什麼樣子?

當你創建一個測試夾具時,從UserControl派生出來是非常奇怪的(IME)。除了別的之外,我不知道NUnit會在任何適當的時候給你打電話Dispose ...這裏的目的是什麼?你不能讓你的測試使用「普通」測試夾具運行嗎?

2

我有完全相同的問題,所以我很抱歉回答這個老帖子。 你的代碼(和我的)的問題是,你正在爲MoneyBox創建2個不同的實例,另外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 

只是任何人都可能再次需要它