模拟对象什么时候进入重放状态?

时间:2009-05-31 15:07:50

标签: c#-3.0 rhino-mocks

执行此代码的第二行时,Rhino Mocks会抛出一个InvalidOperationException,并显示消息“当模拟对象处于重放状态时此操作无效”

var mockScanner = MockRepository.GenerateMock<PortScanner>(null);
        mockScanner.Expect((scanner => { scanner.Scan(null, null); }));

单步调试器中的代码可以看到调试器运行类中定义的方法,并且在控制离开此方法后直接发生异常。

另一个测试中的类似代码可以正常运行

var mockView = MockRepository.GenerateMock<IScanView>(null);
        mockView.Expect(view => { view.Close(); });
        var controller = new ScanController(mockView);
        controller.Exit();
        mockView.VerifyAllExpectations();

我能想到的唯一区别可能是两个测试之间的任何后果是,Exit是接口上的成员,而Scan是类中的虚拟成员

我错过了什么?

更新
进一步的探索表明,这与Rhino处理虚拟方法的方式有关。我现在正专注于对文档的研究

2 个答案:

答案 0 :(得分:12)

异常是由于Rhino Mocks没有对该类型的访问权限以便正确模拟它而引起的。使用InternalsVisibleTo授予对Rhino Mocks程序集的内部访问权限解决了这个问题。

值得注意的是,这不会影响界面。我认为这是因为模拟框架需要覆盖接口上没有的类的实现。

答案 1 :(得分:0)

如果从第一个表达式中删除多余的括号,会发生什么?

var mockScanner = MockRepository.GenerateMock<PortScanner>(null);
mockScanner.Expect( scanner => { scanner.Scan(null, null); } );