如何使用NUnit测试回调函数

5
你在使用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个回答

6

如果您使用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);
}

使用它可以使您的测试更加凝聚,而在任何测试类上拥有字段总是会引发灾难!


我仍然更喜欢将处理程序和状态放在另一个类中。虽然lambda和局部变量消除了对字段的需求,但它仍然使测试方法有点混乱。 - Mike Two
我喜欢这种情况下的lambda表达式,因为您不会在测试类中污染单独的回调方法,这些方法实际上并不真正适合于测试类。也许更复杂的测试可能会使用自己的类Mike,但是我目前想不到这样做有意义的情况。 - Alex

0

据我所知,NUnit 中没有任何特殊的方法来处理这个问题。我测试这些东西的方式与你相同。不过,我倾向于将回调方法和它所存储的状态放在另一个类中。我认为这样会使代码更加清晰,但本质上并没有什么不同。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接