2012-05-18 12 views
5

Ich versuche, einige Unit-Tests zu schreiben einige benutzerdefinierte zu testen NSOperations, die wir schreiben. Was ich tun möchte, ist ein Mock der NSOperation erstellen und es auf die NSOperationQueue setzen, und warten Sie, bis es fertig ist. Ich weiß, ich kann die Methoden swizzle und nicht OCMoc k überhaupt verwenden, aber ich will das wirklich nicht tun. Ich möchte OCMock verwenden. Der Code, den ich versuche zu laufen etwas wie folgt aus:OCMock eine NSOperation

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

Wenn das Gerät Test dieser Linie wird:

[queue addOperation:mockOperation]; 

ich einen Anruf an einen ausgeplanten Objekt Exception. Hat jemand Vorschläge, wie ich das überwinden kann?

+0

Ist das ein ARC-Projekt? –

+0

Ja, es ist ein ARC-Projekt. –

+0

Es gibt ein bekanntes Problem in der Apple Laufzeitumgebung, das OCMock betrifft, wenn ARC aktiviert ist. Weitere Einzelheiten hier: http://www.mulle-kybernetik.com/forum/viewtopic.php?f=4&t=252 –

Antwort

2

Wenn Sie ARC verwenden, operation ist wahrscheinlich richtig freigegeben, nachdem Sie die Mock erstellen, da es wieder nicht zugegriffen wird. Wenn Sie es dies zu ändern, sollte es den Fehler beheben:

[queue addOperation:operation]; 

..., die Sie sowieso tun sollten - du bist Testen Sie Ihr Objekt, nicht das Mock.

+0

Das Problem bei diesem Ansatz ist, dass wenn ich eine Methode auf der Mock-Stub, dass ausgefuehrt wird, oder führt es die Methode auf der tatsächlichen Operation aus? –

+0

Bei partiellen Mocks, wenn Sie eine Methode stub/erwarten, wird diese Methode im Mock anstelle des eigentlichen Objekts aufgerufen. Teilweise Mocks bieten eine Möglichkeit, bestimmte an ein Objekt gesendete Nachrichten abzufangen. Von der [OCMock-Dokumentation] (http://ocmock.org/#features): 'Wenn eine Stubbed-Methode mit einem Verweis auf einObject aufgerufen wird, anstatt auf dem Schein, wird sie weiterhin durch den Mock behandelt –

0

Bei Verwendung von ARC wird der Verweis auf das Objekt in mockOperation wird ziemlich aggressiv eingestellt (zu aggressiv denke ich) durch die Apple-Laufzeitumgebung. Es ist jedoch nicht alles verloren. Sie können Ihre Stubs und Erwartungen mit mockOperation und noch passieren Betrieb zum addOperation einzurichten: Verfahren; Der partielle Mock funktioniert auch, wenn Sie einen Verweis auf das ursprüngliche Objekt verwenden.