C# 3.0 模拟对象何时进入重播状态?

C# 3.0 模拟对象何时进入重播状态?,c#-3.0,rhino-mocks,C# 3.0,Rhino Mocks,当执行此代码的第二行时,Rhino Mocks抛出InvalidOperationException,并显示消息“当模拟对象处于replay状态时,此操作无效” var mockScanner=MockRepository.GenerateMock(null); Expect((scanner=>{scanner.Scan(null,null);})); 通过在调试器中单步执行代码,可以看到调试器运行在类中定义的方法,并且在控件离开此方法后,会直接发生异常 在另一个测试中,类似的代码可以正常工

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

var mockScanner=MockRepository.GenerateMock(null);
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();
var mockView=MockRepository.GenerateMock(null);
Expect(视图=>{view.Close();});
var控制器=新的扫描控制器(mockView);
controller.Exit();
mockView.verifyallexpections();
我能想到的唯一区别可能是这两个测试之间的任何结果,即Exit是接口上的成员,而Scan是类上的虚拟成员

我错过了什么

更新

进一步研究表明,这与Rhino处理虚拟方法的方式有关。我现在重点研究这里的文档

如果从第一个表达式中删除额外的一组括号,会发生什么

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

导致异常的原因是Rhino mock没有所需级别的类型访问权限来正确模拟它。使用InternalsVisible授予Rhino Mocks程序集的内部访问权限以解决此问题


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

然后我的语法有点清晰(谢谢:),不幸的是,我的测试仍然对构造函数中的null参数有任何意义。如果传入的是有效对象而不是null,会发生什么情况?它们通常是由实际控制器传入的IPAddress对象。它们是空的,因为它比其他任何方法(现在是凌晨3:47)更便于键入,但现在该方法是一个空存根,它不在任何地方使用参数,我也用实际参数值尝试过它们,我仍然得到同样的例外,我认为这是一个信号,我正式太老了,不能在这么晚的时候编码,现在我刚刚读到关于今天做这件事。Rhino Mocks wiki条目的文档链接是:虚拟方法是我的答案
var mockScanner = MockRepository.GenerateMock<PortScanner>(null);
mockScanner.Expect( scanner => { scanner.Scan(null, null); } );