2010-06-25 3 views
17

Ich rufe _mocks.ReplayAll(), dann eine oder mehrere _mockedObject.AssertWasCalled() und dann _mocks.VerifyAll(). Aber es sagt mir, dass "diese Aktion ungültig ist, wenn das Mock-Objekt im Aufzeichnungsstatus ist".Wie verwende ich Rhino.Mocks AssertWasCalled() korrekt?

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

Was ist die richtige Reihenfolge so zu nennen, dass diese Methoden korrekt funktionieren?

Antwort

-1

Scheint wie ich die Lösung gefunden. Es scheint ein bisschen komisch, aber es funktioniert. Es stellt sich heraus, dass ich ReplayAll() zweimal aus irgendeinem Grund zu nennen ...

Dies funktioniert:

[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

dort Hallo, könnte nützlich sein, um zu zeigen, wie Sie _manager deklarieren usw. Ich würde es normalerweise nicht so kompliziert machen müssen. Auch der Code, den Sie testen, kann nützlich sein. Wenn Sie suchen, um Rhino Mocks Hilfe zu bekommen, muss ich sagen, ich hatte Hilfe von Kollegen, sondern auch aus dem Buch "The Art of Unit Testing" http://www.manning.com/osherove/ – ArtificialGold

12

Du den alten Record/Replay-Muster und die neue AAA pattern mischen.

Der normale Weg Erwartung bei Aufnahme eines Modus wie folgt aussieht „mit diesen Argumenten nicht aufgerufen“ einzurichten:

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

Oder alternativ können Sie eine strenge Mock verwenden, die einfach unerwartet nicht erlaubt Anrufe.

AssertWasCalled und sind für AAA gedacht, wo Sie Ihre Behauptungen am Ende setzen. Bei der Record/Replay-Syntax sollten sowohl Verhalten als auch Erwartungen am Anfang vor dem Wechsel in den Wiederholungsmodus eingestellt werden.

(AssertWasNotCalled könnte tatsächlich mit Record/Replay arbeiten auch, aber ich versuchte es nie, weil ich aus beiden Ansätzen keine Elemente wie mischen. Es erschwert die Dinge unnötig.)

16

Jon Kruger Blog-Post "How to use rhino mocks documented through tests" hat einfach Beispiele für alles, was Sie mit Rhino-Mock-Methoden tun können. Er zeigt auch, was Sie nicht tun können, was ich beim Lernen sehr hilfreich fand.

Wie bereits erwähnt, ist die Verwendung der Syntax Arrange, Act, Assert mit den statischen Konstruktoren einfacher zu lesen. Der Blogpost zeigt Beispiele für beide Methoden.

Hier sind einige Beispiele von Jons Beispielcode:

Neue Syntax:

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

Old style:

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