2013-04-24 6 views
6

Quando voglio verificare che in un metodo di un oggetto fittizio sta ricevendo alcuni messaggi in un ordine particolare che faccio qualcosa di simile:OCMock - verifica dell'ordine delle chiamate di metodo. C'è un altro modo?

// 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]; 

C'è qualche pulitore/modo migliore di fare questo? Grazie in anticipo.

risposta

15

È possibile utilizzare setExpectationOrderMatters

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

[sut methodToTest]; 

[myMock verify]; 
+0

buona scoperta! Errore di battitura nella tua risposta (messaggioA poi messaggioB). –

+0

Thx, errore di battitura fisso –

2

Mi sembra abbastanza pulito. Se non sei felice di nidificare, potresti introdurre una variabile di blocco.

__block BOOL hasCalledA; 

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

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

La soluzione sembra soddisfacente.

Come nota a margine, penso che questa domanda potrebbe essere più adatta per https://codereview.stackexchange.com/ anche se sto ancora avvolgendo la mia mente intorno a quel sito.

+0

+1 Penso che questo sia più facile da leggere rispetto alla soluzione del PO –