首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何正确使用Rhino.Mocks AssertWasCalled()?

如何正确使用Rhino.Mocks AssertWasCalled()?
EN

Stack Overflow用户
提问于 2010-06-25 17:14:28
回答 3查看 28.8K关注 0票数 18

我调用_mocks.ReplayAll(),然后调用一个或多个_mockedObject.AssertWasCalled(),然后调用_mocks.VerifyAll()。但是它告诉我“当mock对象处于记录状态时,这个操作是无效的”。

代码语言:javascript
复制
[Test]
public void SetStateExecuting_Should_Set_State_To_Pause_And_Not_Change_GlobalState_When_GlobalState_Is_Paused()
{
    var task = new Task { ID = 1, TimeZone = -660, GlobalState = TaskState.Paused };
    _taskDataProvider.Expect(p => p.StateUpdate(task.ID, task.TimeZone, TaskState.Paused));
    _mockRepository.ReplayAll();
    _manager.SetStateExecuting(task);
    _taskDataProvider.AssertWasNotCalled(p => p.GlobalStateUpdate(task.ID, 
                                                                  TaskState.Executing));
    _mockRepository.VerifyAll();
}

为了让这些方法正常工作,调用的正确顺序是什么?

EN

回答 3

Stack Overflow用户

发布于 2010-06-27 01:42:22

Jon Kruger的博客文章"How to use rhino mocks documented through tests"提供了使用rhino mocks方法所能做的一切的简单示例。他还展示了你不能做的事情,我发现这对学习很有帮助。

如前所述,将Arrange,Act,Assert语法与静态构造函数一起使用更容易阅读。这篇博文展示了这两种方法的示例。

以下是Jon示例代码中的示例:

新语法:

代码语言:javascript
复制
 [Test]
    public void You_can_check_to_see_if_a_method_was_called()
    {
        var stub = MockRepository.GenerateStub<ISampleClass>();

        stub.MethodThatReturnsInteger("foo");

        stub.AssertWasCalled(s => s.MethodThatReturnsInteger("foo"));
        stub.AssertWasCalled(s => s.MethodThatReturnsInteger(Arg<string>.Is.Anything));
    }

旧风格:

代码语言:javascript
复制
    [Test]
    public void Calling_virtual_methods_will_call_the_actual_method()
    {
        var mockRepository = new MockRepository();
        var sampleClass = mockRepository.PartialMock<SampleClass>();
        sampleClass.Replay();

        sampleClass.VirtualMethod("foo").ShouldEqual(3);
        sampleClass.VirtualMethodWasCalled.ShouldBeTrue();
        sampleClass.AssertWasCalled(c => c.VirtualMethod("foo"));
    }
票数 18
EN

Stack Overflow用户

发布于 2010-06-25 20:47:48

您正在混合旧的记录/重放模式和新的AAA pattern

在记录模式下设置“不使用这些参数调用”期望的正常方式如下所示:

代码语言:javascript
复制
_taskDataProvider.Expect(
    p => p.GlobalStateUpdate(task.ID, TaskState.Executing)).Repeat.Never();

或者,您也可以使用严格的mock,它不允许意外的调用。

AssertWasCalledAssertWasNotCalled是为AAA设计的,您可以在AAA的末尾放置断言。使用Record/Replay语法,在切换到replay模式之前,应在开始时设置行为和预期。

(AssertWasNotCalled实际上可能也适用于记录/重放,但我从未尝试过,因为我不喜欢将两种方法的元素混合在一起。它不必要地使事情复杂化。)

票数 12
EN

Stack Overflow用户

发布于 2010-06-25 17:29:35

看起来我找到解决方案了。这看起来有点奇怪,但它是有效的。由于某种原因,我需要调用ReplayAll()两次...

这是可行的:

代码语言:javascript
复制
[Test]
public void SetStateExecuting_Should_Set_State_To_Pause_And_Not_Change_GlobalState_When_GlobalState_Is_Paused()
{
    var task = new Task { ID = 1, TimeZone = -660, GlobalState = TaskState.Paused };
    _mockRepository.ReplayAll();
    _manager.SetStateExecuting(task);
    _taskDataProvider.AssertWasCalled(p => p.StateUpdate(task.ID, task.TimeZone, TaskState.Paused));
    _taskDataProvider.AssertWasNotCalled(p => p.GlobalStateUpdate(task.ID, TaskState.Executing));
    _mockRepository.ReplayAll();
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3116851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档