2010-08-20 71 views
3

当您使用NUnit测试回调函数时有没有特别的支持?或者某种“最佳做法”比我的解决方案更好?如何使用NUnit测试回调函数

我刚开始编写一些测试和方法,所以我仍然完全控制 - 但是我认为如果有更好的方法来彻底测试回调,特别是在复杂度增加的时候,可能会很烦人。所以这是我现在正在测试的一个简单示例:

要测试的方法使用委托,该委托调用回调函数,例如一旦在流中发现新的xml元素。出于测试目的,我将NewElementCallback方法传递给委托,并在调用函数时将参数内容存储在某些测试类属性中。这些属性用于断言。 (当然,它们在测试设置中被重置)

[Test] 
public void NewElement() 
{ 
    String xmlString = @"<elem></elem>"; 

    this.xml.InputStream = new StringReader(xmlString); 
    this.xml.NewElement += this.NewElementCallback; 

    this.xml.Start(); 

    Assert.AreEqual("elem", this.elementName); 
    Assert.AreEqual(0, this.elementDepth); 
} 

private void NewElementCallback(string elementName, int elementDepth) 
{ 
    this.elementName = elementName; 
    this.elementDepth = elementDepth; 
} 

回答

4

如果您使用lambda表达式,则可以避免使用专用字段,这就是我通常这样做的方式。

[Test] 
public void NewElement() 
{ 
    String xmlString = @"<elem></elem>"; 
    string elementName; 
    int elementDepth; 

    this.xml.InputStream = new StringReader(xmlString); 
    this.xml.NewElement += (name,depth) => { elementName = name; elementDepth = depth }; 

    this.xml.Start(); 

    Assert.AreEqual("elem", elementName); 
    Assert.AreEqual(0, elementDepth); 
} 

它使你的测试更加凝聚力和任何测试课上的字段总是要求灾难!

+0

我仍然喜欢把处理程序和状态放在另一个类上。虽然lambda和局部变量不需要字段,但它仍然使测试方法有点混乱。 – 2010-08-20 19:48:05

+0

在这种情况下,我喜欢lambda表达式,因为您不会使用单独的回调方法污染您的测试类,而这些方法实际上并不适合测试类。也许更复杂的睾丸可能会利用自己的类迈克,但我不能想到的情况下,这是有道理的呢。 – Alex 2010-08-21 05:12:10

0

对于我所知道的这个,NUnit没有什么特别的。我以同样的方式测试这些东西。我倾向于把回调方法和它存储在另一个类上的状态。我认为它使它更清洁一些,但它并没有根本的不同。

0

从你的例子,我不能确切地告诉你想要做什么,但是,NUnit没有提供任何具体的方式来测试这种事情,但是这个链接应该给你一些想法如何启动单元测试异步代码:Unit Testing Asynchronous code