2012-05-18 11 views
5

Sto provando a scrivere alcuni Test unitari per testare alcuni NSOperations personalizzati che stiamo scrivendo. Quello che mi piacerebbe fare è creare un Mock of the NSOperation e metterlo sullo NSOperationQueue, e quindi attendere che finisca. So che posso swizzle i metodi e non usare lo OCMoc k, ma davvero non voglio farlo. Mi piacerebbe usare OCMock. Il codice che sto cercando di correre è qualcosa di simile al seguente:OCMock an NSOperation

MYOperation *operation = [MYOperation new]; 
id mockOperation = [OCMockObject partialMockForObject:operation]; 
[NSOperationQueue *queue = [NSOperationQueue new]; 
[queue setMaxConcurrentOperationCount:1]; 
[queue addOperation:mockOperation]; 

Quando il test di unità arriva a questa linea:

[queue addOperation:mockOperation]; 

ricevo una chiamata a un oggetto un'eccezione deallocato. Qualcuno ha qualche suggerimento su come posso superare questo?

+0

Si tratta di un progetto ARC? –

+0

Sì, è un progetto ARC. –

+0

Esiste un problema noto nel runtime di Apple che riguarda OCMock quando ARC è abilitato. Maggiori dettagli qui: http://www.mulle-kybernetik.com/forum/viewtopic.php?f=4&t=252 –

risposta

2

Se si sta utilizzando ARC, è probabile che il codice operation venga rilasciato subito dopo aver creato la simulazione, poiché non è più accessibile. Se si cambia per questo, dovrebbe correggere l'errore:

[queue addOperation:operation]; 

... che si dovrebbe fare in ogni modo - tu sei il test l'oggetto, non il finto.

+0

Il problema con questo approccio è che se cancello un metodo sulla simulazione, viene eseguito o esegue il metodo sull'effettiva operazione? –

+0

Con i mock parziali, se si sospende/si aspetta un metodo, tale metodo verrà richiamato sulla simulazione anziché sull'oggetto reale. I mazzi parziali forniscono un modo per intercettare determinati messaggi inviati a un oggetto. Da [OCMock docs] (http://ocmock.org/#features): 'Quando viene invocato un metodo di stub usando un riferimento a anObject, piuttosto che al mock, esso verrà comunque gestito dalla simulazione. –

0

Quando si utilizza ARC il riferimento all'oggetto in mockOperation verrà impostato su nil in modo abbastanza aggressivo (troppo aggressivo, credo) dal runtime di Apple. Non tutto è perduto, però. Puoi configurare i tuoi stub e le tue aspettative usando mockOperation e passare ancora l'operazione al metodo addOperation:; la simulazione parziale funziona anche quando si utilizza un riferimento all'oggetto originale.