2013-04-24 11 views
6

Kiedy chcę, aby sprawdzić, w jednej metodzie atrapa obiektu odbiera komunikaty w określonej kolejności zrobić coś takiego:OCMock - weryfikacja kolejności wywołań metod. Czy jest jakiś inny sposób?

// sut is an instance of the class I am testing and myMock is a mock object injected in sut. 
// I want to test that myMock sends messageA and then messageB, in that particular order. 
[[[myMock expect] andDo:^(NSInvocation *invocation) 
    { 
     [[myMock expect] messageB]; 
    }] 
messageA]; 

[sut methodToTest]; 

[myMock verify]; 

Czy istnieje czystsze/lepszy sposób to zrobić? Z góry dzięki.

Odpowiedz

15

Można użyć setExpectationOrderMatters

[myMock setExpectationOrderMatters:YES]; 
[[myMock expect] messageA]; 
[[myMock expect] messageB]; 

[sut methodToTest]; 

[myMock verify]; 
+0

Dobre znaleźć! Drobne literówki w odpowiedzi (wiadomośćA, a następnie wiadomośćB). –

+0

Thx, poprawiono literówkę –

2

To wygląda na całkiem czyste. Jeśli nie jesteś zadowolony z zagnieżdżania, możesz wprowadzić zmienną blokową.

__block BOOL hasCalledA; 

[[[myMock expect] andDo:^(NSInvocation *invocation) { 
    hasCalledA = YES; 
    }] messageA]; 

[[[myMock expect] andDo:^(NSInvocation *invocation) { 
    STAssertTrue(hasCalledA); 
    }] messageB]; 

Twoje rozwiązanie wygląda jednak dobrze.

Na marginesie uważam, że to pytanie może lepiej pasować do https://codereview.stackexchange.com/, mimo że wciąż owijam głowę wokół tej witryny.

+0

+1 myślę, że to jest łatwiejsze do odczytania niż rozwiązania OP –

Powiązane problemy