我拨打_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();
}
调用正确的顺序是什么,以便这些方法正常工作?
答案 0 :(得分:16)
Jon Kruger的博文"How to use rhino mocks documented through tests"提供了使用rhino mocks方法可以做的所有事情的简单示例。他还展示了我不能做的事情,我觉得这对学习很有帮助。
如前所述,使用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));
}
旧式:
[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"));
}
答案 1 :(得分:12)
您正在混合旧的录制/重播模式和新的AAA pattern。
在记录模式下设置“未使用这些参数调用”的常规方法如下所示:
_taskDataProvider.Expect(
p => p.GlobalStateUpdate(task.ID, TaskState.Executing)).Repeat.Never();
或者,您可以使用严格模拟,但不允许意外调用。
AssertWasCalled
和AssertWasNotCalled
适用于AAA,您可以将断言放在最后。使用Record / Replay语法,应该在切换到重放模式之前的开始时设置行为和expecations。
(AssertWasNotCalled
也可能实际上与Record / Replay一起使用,但我从未尝试过,因为我不喜欢混合两种方法中的元素。这会使事情变得不必要。)
答案 2 :(得分:-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();
}