2010-06-25 59 views
17

我叫_mocks.ReplayAll(),然后一个或多个_mockedObject.AssertWasCalled(),然后_mocks.VerifyAll()。但它告诉我“当模拟对象处于记录状态时,此操作无效”。如何正确使用Rhino.Mocks AssertWasCalled()?

[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(); 
} 

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

回答

-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(); 
} 
+2

您好, 可能是有用的,以显示你是如何声明_manager等我通常不需要使它如此复杂。还看到你正在测试的代码可能会有用。 如果您正在寻找获得Rhino Mocks的帮助,我必须说我得到了同事的帮助,但也得到了“单元测试的艺术”一书的帮助http://www.manning.com/osherove/ – ArtificialGold 2010-06-25 10:32:10

12

你混合旧的录制/回放模式和新AAA pattern

正常的方式来建立一个“不叫这些论点”的预期,而在记录模式是这样的:

_taskDataProvider.Expect(
    p => p.GlobalStateUpdate(task.ID, TaskState.Executing)).Repeat.Never(); 

或者,你可以使用严格的模拟,其根本不容许意外调用。

AssertWasCalledAssertWasNotCalled适用于您在最后放置断言的AAA。使用Record/Replay语法,在切换到重放模式之前,应在开始时设置行为和预期。

AssertWasNotCalled实际上可能与录制/回放工作还可以,但我从来没有尝试过,因为我不喜欢混合使用这两种方法的元素。它不必要的复杂的东西。)

16

乔恩·克鲁格的博客文章"How to use rhino mocks documented through tests"简单你可以用rhino mocks方法做的所有事情的例子。他还展示了你不能做的事情,这对我的学习非常有帮助。

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

这里是从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")); 
    }