如何使用NUnit测试回调

时间:2010-08-20 19:09:06

标签: c# unit-testing delegates nunit callback

使用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;
}

3 个答案:

答案 0 :(得分: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);
}

它使您的测试更具凝聚力,并且在任何测试类中都有字段总是要求发生灾难!

答案 1 :(得分:0)

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

答案 2 :(得分:0)

从你的例子中,我无法准确说出你想要做什么,但是,NUnit没有提供任何特定的方法来测试这种事情,但是这个链接应该提供一些关于如何开始的想法单元测试异步代码:Unit Testing Asynchronous code