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

Hiv*_*cks 18 c# nunit assert rhino-mocks

我打电话_mocks.ReplayAll(),然后一个或多个_mockedObject.AssertWasCalled()然后_mocks.VerifyAll().但它告诉我"当模拟对象处于记录状态时,此操作无效".

[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();
}
Run Code Online (Sandbox Code Playgroud)

调用正确的顺序是什么,以便这些方法正常工作?

Mag*_*gie 17

Jon Kruger的博客文章"如何使用通过测试记录的犀牛模拟"有一些简单的例子,说明了使用rhino模拟方法可以做的一切.他还展示了你不能做的事情,我觉得这对学习非常有帮助.

如前所述,使用Arrange,Act,Assert语法和静态构造函数更容易阅读.博客文章显示了这两种方法的示例.

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

新语法:

 [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));
    }
Run Code Online (Sandbox Code Playgroud)

老式:

    [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"));
    }
Run Code Online (Sandbox Code Playgroud)


Wim*_*nen 12

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

在记录模式下设置"未使用这些参数调用"的常规方法如下所示:

_taskDataProvider.Expect(
    p => p.GlobalStateUpdate(task.ID, TaskState.Executing)).Repeat.Never();
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用严格模拟,但不允许意外调用.

AssertWasCalled并且AssertWasNotCalled适用于AAA,您可以将断言放在最后.使用Record/Replay语法,应在切换到重放模式之前的开始处设置行为和expecations.

(AssertWasNotCalled可能实际上也可以使用Record/Replay,但我从未尝试过,因为我不喜欢混合两种方法中的元素.这不必要地使事情变得复杂.)


Hiv*_*cks -1

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

这有效:

[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();
}
Run Code Online (Sandbox Code Playgroud)

  • 您好,可能有助于展示您如何声明 _manager 等。我通常不需要使它如此复杂。另外查看您正在测试的代码可能会有用。如果您正在寻求 Rhino Mocks 的帮助,我必须说我得到了同事的帮助,也得到了《单元测试的艺术》一书的帮助 http://www.manning.com/osherove/ (2认同)