当使用Rhino Mocks模拟一个函数时,为什么需要使用Replay()方法?

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

重放的作用是什么?

在录制并播放操作的情况下,我理解需要使用Replay()调用,但如果我不录制任何东西,为什么还要写一行代码呢?我只需要一个返回我的对象的属性即可。

3个回答

7

更新:

您没有正确使用AAA语法。您不再需要一个MockRepository实例(这在Rhino 3.5之前已经被使用过了)。只需调用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();

很不幸,如果没有Replay()调用,我的测试将失败,并显示以下消息:"'IOperationContext.get_Channel();'需要返回值或异常抛出。"(我使用的是最新的Rhino Mocks 3.6)。因此,在你的回答中,“不需要调用Replay”是不正确的。 - Vasyl Boroviak
这一定是其他问题。在 Stub 之后没有必要调用 Replay。 - Stefan Steinegger
这就是我一直在寻找的答案。非常感谢您的时间和努力。最终,我已经让我们的测试清晰明了地呈现给了我和同事们。 - Vasyl Boroviak

1
在调用Replay方法之前,RhinoMocks模拟对象处于记录状态。这意味着您可以控制模拟的行为,即使您不是在记录任何内容,您仍然可以使用例如Stub告诉模拟对象如何行事。调用Replay会停止测试更改模拟行为并开始实际按您所指示的方式行为。 更新 Record方法仅存在以允许测试将模拟对象退回到录制状态并修改模拟的行为。我强烈建议不要这样做。通常,我只使用MockRepository.ReplayAll()MockRepository.VerifyAll()方法。

请问您能否回答我一个问题:如果默认情况下已经在录制 MockRepository.Record() 函数,那么为什么还需要该函数存在呢? - Vasyl Boroviak
1
我认为在使用.Expect()或类似函数时将对象置于记录状态是合理的。然而,当仅使用.Stub().Return()等简单操作时,我看不出有任何将对象置于记录状态的理由。 - Vasyl Boroviak
瓦西里:你是对的,没有必要重播。即使是Expect也不需要。看看我的更新答案。 - Stefan Steinegger

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);

感谢分离。虽然这是一种非常古老且不常用的技术,所以我甚至都没有费心去使用它。 - Vasyl Boroviak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接