我调用_mocks.ReplayAll()
,然后调用一个或多个_mockedObject.AssertWasCalled()
,然后调用_mocks.VerifyAll()
。但是它告诉我“当mock对象处于记录状态时,这个操作是无效的”。
[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();
}
为了让这些方法正常工作,调用的正确顺序是什么?
发布于 2010-06-27 01:42:22
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"));
}
发布于 2010-06-25 20:47:48
您正在混合旧的记录/重放模式和新的AAA pattern。
在记录模式下设置“不使用这些参数调用”期望的正常方式如下所示:
_taskDataProvider.Expect(
p => p.GlobalStateUpdate(task.ID, TaskState.Executing)).Repeat.Never();
或者,您也可以使用严格的mock,它不允许意外的调用。
AssertWasCalled
和AssertWasNotCalled
是为AAA设计的,您可以在AAA的末尾放置断言。使用Record/Replay语法,在切换到replay模式之前,应在开始时设置行为和预期。
(AssertWasNotCalled
实际上可能也适用于记录/重放,但我从未尝试过,因为我不喜欢将两种方法的元素混合在一起。它不必要地使事情复杂化。)
发布于 2010-06-25 17:29:35
看起来我找到解决方案了。这看起来有点奇怪,但它是有效的。由于某种原因,我需要调用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();
}
https://stackoverflow.com/questions/3116851
复制相似问题