2016-05-31 52 views
4

我是OCMock的全新產品。OCMock自動在被測代碼中使用mocked實例嗎?

我使用dispatch_once()創建一個單獨的類MyManager

@implementation MyManager 

+ (id)sharedInstance { 
    static MyManager *sharedMyManager = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedMyManager = [[self alloc] init]; 
    }); 
    return sharedMyManager; 
} 

我有School類的方法,其使用上述單:

@implementation School 
... 
- (void) createLecture { 
    MyManager *mgr = [MyManager sharedInstance]; 
    [mgr checkLectures]; 
    ... 
} 
@end 

現在,我要進行單元測試該方法,我使用MyManager的部分模擬:

- (void) testCreateLecture { 
    // create a partially mocked instance of MyManager 
    id partialMockMgr = [OCMockObject partialMockForObject:[MyManager sharedInstance]]; 

    // run method to test 
    [schoolToTest createLecture]; 
    ... 
} 

我注意到用OCMock創建了我的單例MyManager實例的部分模擬,當運行我的測試方法時,自動使用使用部分模擬實例。

這是有點怪我,因爲在我上面的測試案例,我只創建了MyManager實例的部分模擬沒有它注入到MyManager類,

如何OCMock自動強制下測試使用此代碼在被測代碼中調用[MyManager sharedInstance]時嘲笑實例嗎?有人可以向我解釋這一點嗎?

回答

3

partialMockForObject嘲笑你傳遞給它的對象。

在這種情況下,你正在嘲笑單身(共享)對象。您不必注入任何東西,因爲sharedInstance總是返回現在被嘲笑的同一個對象。它仍然是同樣的參考。

想象一下,部分模擬是傳遞對象的簡單變異,它不會創建新實例,因此您無需在此特定情況下注入它。

2

部分嘲笑非常酷。在幕後,OCMock對你正在嘲笑的類進行子類化,並且任何你存根的方法都在部分模擬子類中更新。因此,所有對你的模擬類的引用現在默認爲子類(模擬實現)而不是超類(你的實現)。這方面也有不錯的explanation in the reference

+0

即使我接受了@Sulthan的回答,您的答案中的信息對我來說也是非常重要的!謝謝! –

相關問題