2012-05-18 59 views
5

我想寫一些單元測試來測試我們正在編寫的一些自定義NSOperations。我想要做的是創建一個模擬NSOperation並將其放在NSOperationQueue,然後等待它完成。我知道我可以調整方法,根本不使用OCMoc k,但我真的不想這樣做。我想用OCMock。我試圖運行的代碼是像下面這樣:OCMock一個NSOperation

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

當單元測試得到這一行:

[queue addOperation:mockOperation]; 

我得到解除分配對象異常的調用。任何人有任何建議我如何克服這一點?

+0

這是一個ARC項目嗎? –

+0

是的,這是一個ARC項目。 –

+0

當啓用ARC時,Apple運行時存在一個影響OCMock的已知問題。更多細節在這裏:http://www.mulle-kybernetik.com/forum/viewtopic.php?f=4&t=252 –

回答

2

如果您使用ARC,operation可能在您創建模擬後立即發佈,因爲它不會再次訪問。如果你改變它,它應該修復錯誤:

[queue addOperation:operation]; 

......你應該做的反正 - 你測試你的對象,而不是模擬。

+0

這種方法的問題是,如果我在模擬上存留一個方法,是否執行或它是否在實際操作上執行該方法? –

+0

對於部分模擬,如果你存根/期望一個方法,那麼該方法將在模擬中被調用,而不是實際的對象。部分模擬提供了一種攔截髮送給對象的特定消息的方法。從[OCMock docs](http://ocmock.org/#features):'當使用對象的引用而不是模擬來調用存根方法時,它仍然會被模擬處理。 –

0

當使用ARC對中的對象的引用時,mockOperation將被設置爲無相當積極(我認爲太積極)的Apple運行時。不過,並不是所有的東西都丟失您可以使用mockOperation設置您的存根和期望,並仍然將操作設置爲addOperation:方法;即使您使用對原始對象的引用,部分模擬也能正常工作。