c#:如何验证方法是否按特定顺序调用?

c#:如何验证方法是否按特定顺序调用?,c#,unit-testing,mocking,rhino-mocks,C#,Unit Testing,Mocking,Rhino Mocks,我有以下课程: public class Script { IPrinter _printer; public Script(IPrinter printer) { _printer = printer; } public void Print(TextWriter writer) { _printer.PrintComment(writer, "lolz"); writer.WriteLine(

我有以下课程:

public class Script
{
    IPrinter _printer;

    public Script(IPrinter printer)
    {
        _printer = printer;
    }

    public void Print(TextWriter writer)
    {
        _printer.PrintComment(writer, "lolz");
        writer.WriteLine("omg this complicates things";
        _printer.PrintSpecial(writer);
        if (signoff)
            _printer.PrintComment(writer, "kthxbye");
    }
}
我应该如何设置测试来断言打印机方法是以正确的顺序和正确的参数调用的

我可以手动创建一个“假”打印机,并对writer进行状态测试,但由于上下文太大(特别是因为脚本也与writer一起工作),我希望避免使用它


我用的是nunit和rhino Mock。任何关于架构更改或模拟过程的想法都将使其更易于测试,我们将不胜感激。不幸的是,我正在使用的真正代码更复杂,但这就是要点。

您不需要测试调用了什么顺序方法。由于调用了
Print
方法,因此应该进行测试以确保产生了正确的效果


但是,如果您真的必须这样做,我认为最好的方法是创建一个模拟IPrinter,它存储调用的顺序函数和传递的参数,然后可以在测试中断言这些参数。

您不需要测试编译器。如果你在做一些线程,我可以看到它。。。但在这种情况下,根据你发布的内容,你不是

正如您所说,您可以创建一个模拟打印机,并测试方法是否按顺序调用,但这是多余的

如果没有调用前置条件(即前面的方法),那么在特定的方法中抛出异常可能会更好,但这意味着需要重构为单个方法


此外,您可以使用该模式来确保按顺序调用方法,但除非您有其他需要使用该顺序的对象,否则这将是过分的。

您不能使用静态AAA语法来验证Rhino中的行为。不幸的是,您必须回到旧样式的“重播”做得很好

我不是犀牛专家,我通常使用Moq,但我认为这是正确的:

var mocks = new MockRepository();
var printer = mocks.DynamicMock<IPrinter>();
using (mocks.Ordered())
{
    printer.Expect(x => x.PrintComment());
    printer.Expect(x => x.PrintSpecial());
    printer.Expect(x => x.PrintComment());
}
printer.Replay();
Script = new Script(printer);

... Execute Test...

printer.VerifyAllExpectations();
var mocks=new MockRepository();
var printer=mocks.DynamicMock();
使用(mocks.Ordered())
{
Expect(x=>x.printcoment());
Expect(x=>x.printspect());
Expect(x=>x.printcoment());
}
printer.Replay();
脚本=新脚本(打印机);
... 执行测试。。。
打印机。VerifyAllExpections();

方法的测试顺序称为行为测试,这样做有很多原因,因此我强烈不同意您的说法。状态测试不是编写单元测试的唯一方法!将第三行更改为“使用(mocks.Ordered())”以使语法正确。