繁体   English   中英

当使用Rhino Mocks对函数进行存根时,为什么需要重放()?

[英]Why do I need to Replay() when stubbing a function with Rhino Mocks?

var contextChannel = this.MockRepository.Stub<IContextChannel>();
var context = this.MockRepository.Stub<IOperationContext>();
context.Stub(x => x.Channel).Return(contextChannel);
context.Replay();

什么是重播?

我知道在录制和播放动作的情况下,Replay()调用是必要的。 但是我不清楚为什么在我没有记录任何内容的情况下我被迫再编写一行代码。 我需要的只是一个返回我的对象​​的属性。

更新:

您没有正确使用AAA语法。 您不再需要MockRepository的实例(这已经在3.5之前用于Rhino)。 只需在MockRepository上调用静态方法:

var contextChannel = MockRepository.GenerateStub<IContextChannel>();
var context = MockRepository.GenerateStub<IOperationContext>();
context.Stub(x => x.Channel).Return(contextChannel);

这是一些文档:

原始答案

你没有。 没有必要在像你这样的情况下调用Replay

在以前的版本中,有一个“记录重放”范例,您可以记录期望并在测试期间重播它们。 它已被AAA语法所取代,您可以更轻松,更灵活地设置模拟。

在幕后,仍然有模拟的记录和重播状态。 Stub这样的方法将模拟器置于记录状态,配置它,然后将它们放回记录状态。 在这些情况下,您无需显式调用Record

如果你想做一些更高级的操作,你可以自己设置模拟重放状态,用它做一些事情,例如。 为了重置期望:

mock.BackToRecord(BackToRecordOptions.All);
mock.Replay();

回答问题:

var repo = new MockRepository();
var stubbedInterface = repo.Stub<IAnInterface>();
stubbedInterface.Stub(x => x.SomeProperty).Return(someValue);

这里的最后一行将存储库置于记录状态,但它是一个简单的存根。 因此Replay是必要的。 对于AAA模式,应使用其他语法:

var stubbedInterface = MockRepository.GenerateStub<IAnInterface>();
stubbedInterface.Stub(x =>SomeProperty).Return(someValue);

在调用Replay方法之前,RhinoMocks模拟处于记录状态。 这意味着你可以控制模拟的行为方式,即使你本身没有记录任何东西,你仍然告诉模拟如何表现为 isomg,例如Stub 调用Replay阻止您的测试更改模拟的行为方式,并按照您的指示开始实际操作。

UPDATE

Record方法仅用于允许测试将模拟对象移回记录状态并修改模拟的行为。 我强烈建议不要这样做。 通常我只使用MockRepository.ReplayAll()MockRepository.VerifyAll()方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM