C# 如何使用NUnit测试回调

C# 如何使用NUnit测试回调,c#,unit-testing,delegates,nunit,callback,C#,Unit Testing,Delegates,Nunit,Callback,当您使用NUnit测试回调时,是否有任何特殊支持?或者某种比我下面的解决方案更好的“最佳实践” 我刚刚开始编写一些测试和方法,所以我仍然拥有完全的控制权——但是我认为如果有更好的方法彻底测试回调,尤其是在复杂性不断增加的情况下,这可能会很烦人。这是我现在测试的一个简单示例: 要测试的方法使用委托,委托调用回调函数,例如在流中发现新的xml元素时。出于测试目的,我将NewElementCallback方法传递给委托,并在调用函数时将参数内容存储在一些测试类属性中。我用于断言的这些属性。(当然,它们

当您使用NUnit测试回调时,是否有任何特殊支持?或者某种比我下面的解决方案更好的“最佳实践”

我刚刚开始编写一些测试和方法,所以我仍然拥有完全的控制权——但是我认为如果有更好的方法彻底测试回调,尤其是在复杂性不断增加的情况下,这可能会很烦人。这是我现在测试的一个简单示例:

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

[测试]
公共无效新元素()
{
字符串xmlString=@”;
this.xml.InputStream=新的StringReader(xmlString);
this.xml.NewElement+=this.NewElement回调;
this.xml.Start();
Assert.AreEqual(“elem”,this.elementName);
Assert.AreEqual(0,this.elementDepth);
}
私有void NewElementCallback(字符串elementName,int elementDepth)
{
this.elementName=elementName;
this.elementDepth=elementDepth;
}

据我所知,NUnit在这方面没有什么特别之处。我和你一样测试这些东西。我确实倾向于将回调方法及其存储的状态放在另一个类上。我认为这会让它更干净一些,但它并没有本质上的区别。

从你的例子中,我不能确切地说出你想要做什么,但是,NUnit没有提供任何具体的方法来测试这类事情,然而,这个链接应该为您提供一些关于如何开始单元测试异步代码的想法:

如果您使用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);
}
[测试]
公共无效新元素()
{
字符串xmlString=@”;
字符串元素名;
内部元素深度;
this.xml.InputStream=新的StringReader(xmlString);
this.xml.NewElement+=(名称,深度)=>{elementName=name;elementDepth=depth};
this.xml.Start();
Assert.AreEqual(“elem”,elementName);
aresequal(0,elementDepth);
}

它使您的测试更加内聚,在任何测试类上都有字段总是要求灾难

我仍然喜欢将处理程序和状态放在另一个类上。虽然lambda和局部变量消除了对字段的需要,但它仍然使测试方法有点混乱。我喜欢这种情况下的lambda表达式,因为您不会用实际不适合测试类的单独回调方法污染测试类。也许更复杂的测试可能会使用自己的类Mike,但是如果这样做有意义的话,我想不出一个案例。
[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);
}