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

时间:2012-02-24 09:51:19

标签: c# .net rhino-mocks

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

什么是重播?

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

3 个答案:

答案 0 :(得分:7)

<强>更新

您没有正确使用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();

答案 1 :(得分:1)

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

<强>更新

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

答案 2 :(得分:1)

从问题中撤离的答案:

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);
相关问题