2009-02-24 82 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 

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