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

Dan*_*nor 2 c# unit-testing rhino-mocks mocking

我有以下课程:

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

如何设置测试以声明使用正确的参数以正确的顺序调用打印机方法?

我可以手动创建一个'假'打印机并对编写器进行状态测试,但由于上下文很大(特别是因为脚本也在与编写器一起使用),我想避免它.

我正在使用nunit和rhino模拟器.任何关于体系结构更改的想法或模拟程序,以使这更容易测试,这是值得赞赏的.不幸的是,我正在使用的真实代码更复杂 - 但这是要点.

wom*_*omp 5

你不能使用静态AAA语法来验证Rhino中的行为,你不得不回到旧式"重播"来做AFAIK.

我不是犀牛专家,我通常使用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();
Run Code Online (Sandbox Code Playgroud)