2010-06-25 17 views
17

Dzwonię pod numer _mocks.ReplayAll(), następnie jeden lub więcej _mockedObject.AssertWasCalled(), a następnie _mocks.VerifyAll(). Ale mówi mi, że "Ta akcja jest nieważna, gdy fałszywy obiekt jest w stanie rekordowym".Jak poprawnie używać 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(); 
} 

Jaka jest prawidłowa kolejność nazwać tak, że te metody działają poprawnie?

Odpowiedz

-1

Wygląda na to, że znalazłem rozwiązanie. Wydaje się to trochę dziwne, ale działa. Okazuje się, że muszę zadzwonić ReplayAll() dwa razy z jakiegoś powodu ...

to działa:

[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

Cześć, może być przydatne, aby pokazać, jak deklarują _manager itp. Normalnie nie musiałbym robić tego tak skomplikowanego. Również sprawdzanie kodu, który testujesz, może być przydatne. Jeśli szukasz pomocy Rhino Mocks, muszę powiedzieć, że otrzymałem pomoc od kolegów, ale także z książki "The Art of Unit Testing" http://www.manning.com/osherove/ – ArtificialGold

12

Jesteś mieszanie starego wzoru Record/Replay i nowy AAA pattern.

normalny sposób założyć „nie nazywa się z tymi argumentami” oczekiwanie, podczas gdy w trybie nagrywania wygląda następująco:

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

lub alternatywnie można użyć ścisłe makiety, które po prostu nie pozwala na nieoczekiwane połączenia.

AssertWasCalled i AssertWasNotCalled są przeznaczone dla AAA, gdzie umieszczasz swoje twierdzenia na końcu. W przypadku składni Record/Replay, zarówno zachowanie, jak i expekacje powinny zostać ustawione na początku przed przełączeniem w tryb powtórki.

(AssertWasNotCalled rzeczywistości może pracować z nagrywanie/odtwarzanie również, ale nigdy nie próbowałem, bo nie lubią mieszać elementy z obu podejść. To niepotrzebnie komplikuje.)

16

Jon Kruger na blogu "How to use rhino mocks documented through tests" posiada prosty przykłady wszystkiego, co można zrobić za pomocą metod makrofotograficznych. Pokazuje również, czego nie możesz zrobić, co okazało się bardzo pomocne w nauce.

Jak wspomniano wcześniej, użycie składni, aktu, składni asercji z konstruktorami statycznymi jest łatwiejsze do odczytania. W poście na blogu pokazano przykłady obu metod.

Oto przykłady z Jona przykładowy kod:

nową składnię:

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

Stary styl:

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