2014-04-14 65 views
1

我一直在使用OCMock來創建存根和嘲笑。儘管如此,我仍在努力嘲笑本地聲明的對象方法。OCMock:嘲笑本地聲明對象的方法

如果我有下面的代碼:

// Example.m 
#import "Object.h" 

- (NSString *) methodWithLocallyDeclaredObject{ 

    Object *obj = [[Object alloc] init]; 
    NSString *string1 = [obj methodOnObject]; 
    NSString *string2 = [NSString stringWithFormat:@"prepend %@", string1]; 

    return string2; 

}

我希望能夠在調用存根出來methodOnObject因爲它與文件系統進行交互,只是返回一個字符串。我將如何做到這一點?

回答

1

這是不可能的,你的代碼是這樣做的。你可以做兩件事來測試這種情況 - 使用依賴注入或者工廠方法。

選項1 - 依賴注入:

更改您的方法簽名,要求的對象,而不是創建它:

-(NSString *) methodWithObject:(Object*)obj 
{ 
} 

這種方法優於選項2,但並不完全符合你問的問題。

選項2 - 工廠方法:

而不是創建對象直列,使用一個輔助方法,將其返回到你:

- (NSString *) methodWithLocallyDeclaredObject{ 

    Object *obj = [self newObject]; 
    NSString *string1 = [obj methodOnObject]; 
    NSString *string2 = [NSString stringWithFormat:@"prepend %@", string1]; 

    return string2; 
} 

-(Object*)newObject 
{ 
    return [[Object alloc] init]; 
} 

那麼你可以使用部分模擬模擬出方法newObject並返回不同的東西。

id partiallyMockedObject = [OCMockObject partialMockForObject:objectToTest]; 
[[[partiallyMockedObject expect] andReturn:yourMock] newObject]; 

那麼,你是部分嘲諷你要測試的對象(objectToTest)返回一個存根實現您的本地創建的對象的

+0

其實,你可以在存根'Object'的'+ alloc'類的方法並讓它返回一個模擬,然後你可以存儲'methodOnObject'。我沒有發佈這個答案,因爲我認爲在這個答案中提出的兩個選項是非常可取的。 –

+0

啊,好吧,稍微惱人的是,它不能直接完成。我有一種感覺,我會遇到這種情況很多。你有什麼理由說,扼殺alloc類方法是不可取的?選項二是明智的,也非常簡單(感謝@ michael!),但我覺得我的課程將充斥着輔助方法,而這些輔助方法並沒有真正添加任何東西。 – teddy777

+1

這是使用依賴注入的重要原因 - 它使您的代碼更容易測試並避免創建所有這些樣板。 – michaels