2016-03-23 50 views
1

我有兩個類。驗證從另一個對象調用方法OCMock

對象1:

- (void) methodA { 
    ObjectB objectB = [[ObjectB alloc] init]; 
    [objectB methodB]; 
} 

和目標2:

- (void) methodB { 
    // Does something 
} 

使用OCMock,我如何驗證methodA電話methodB?我設置測試了類似如下:

id mock = OCMClassMock([Object2 class]); 
OCMStub([mock methodB).andReturn(nil); 

[self.object1 methodA]; 
OCMVerify([mock methodB]); 

的測試類測試object1,但我想,以驗證它調用對象2的方法。當運行這個測試時,我得到了失敗的消息:

Method methodB was not invoked. 

我對於模擬/存根還是很新的。我構建測試錯誤是完全可能的。該模擬讓我有點困惑,因爲我正在測試Object1,但試圖驗證Object2上的內容。

我在設置這個測試時是否正確思考?如果不是,我該如何處理?

回答

0

您必須確定(不知何故)Object1使用模擬而不是ObjectB的新實例。通常的做法是依賴注入,即。 Object1對Object2具有依賴性,但Object1不是創建Object2的實例,而是從外部(注入)設置Object2的實例。網絡上有大量關於它的內容。

與OCMock你可以用另一種方式破解你的方式。不過這不推薦。您可以將alloc/init替換爲new,然後存根new類方法返回模擬。這樣Object1會在不知道它的情況下使用模擬。它仍然會「認爲」它分配了一個新的Object2實例。

id mock = OCMClassMock([Object2 class]); 
OCMStub([mock new]).andReturn(mock); 
OCMStub([mock methodB).andReturn(nil); 

[self.object1 methodA]; 
OCMVerify([mock methodB]); 

這在9.3的參考文獻中提到。創建對象的存根方法。

相關問題