2009-05-31 41 views
9

执行此代码犀牛制品抛出与消息一个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(); 

,我能想到的唯一的区别可能是theese两个测试之间的任何consequense的是,退出是同时扫描界面上的成员是一类虚拟成员

我错过了什么?

更新
进一步研究表明,这是关系到犀牛处理虚拟方法的方式。我正在关注这里的文档mmy研究

回答

12

异常是因为犀牛嘲笑没有以正确的嘲笑它访问类型所需的水平所致。使用InternalsVisible授予对Rhino Mocks程序集的内部访问权限解决此问题。

值得注意的是,这不影响接口。我相信这样做的原因是因为模拟框架需要重写一个接口上没有的类的实现。

0

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

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

然后我的语法得到一个清除器(谢谢:)),不幸的是我的测试仍然抛出 – Crippledsmurf 2009-05-31 15:31:31

+0

对构造函数中的null参数有任何意义。如果你传递一个有效的对象而不是null,会发生什么? – tvanfosson 2009-05-31 15:45:17