2012-06-29 102 views
3

在我的XCode項目我有:iOS單元測試私人模擬對象?

  • 控制器
  • (辛格爾頓)databaseController

的databaseController在控制器類中實例化。

如何使用模擬對象替換此數據庫控制器以驗證控制器類的正常運行而不依賴於實際的數據庫控制器?

說明:
- OCUnit用於單元測試。
- OCMock用於創建模擬對象。

獎金問題:如果databaseController不是單身人士?

+0

我認爲你的「如果databaseController不是一個單身人士」是一個太模糊的問題,而不瞭解你的應用程序的需求。 –

回答

2

這是我一直在採取的方法。在你的單身:

static SomeManager *_sharedInstance = nil; 

+(SomeManager *)sharedInstance { 
    if (_sharedInstance == nil) { 
     _sharedInstance = [[SomeManager alloc] init]; 
    } 
    return _sharedInstance; 
} 

+(void)setSharedInstance:(SomeManager *)instance { 
    _sharedInstance = instance; 
} 

然後,在您的測試:

-(void)testSomethingThatUsesSingleton { 
    id mockManager = [OCMockObject mockForClass:[SomeManager class]]; 
    [SomeManager setSharedInstance:mockManager]; 
    [[mockManager expect] something]; 

    [controller doSomething]; 

    [mockManager verify]; 
    [SomeManager setSharedInstance:nil]; 
} 

不要忘記在測試結束時設定的單回零。我通常在我的單元測試基類中的tearDown中這樣做,所以它在每次測試後自動發生。

或者,您可以create a category in your unit tests that overrides sharedInstance to return a mock object

+0

這適用於Singleton對象。一般來說,我仍然對模擬對象感到困惑,但我會嘗試自己解決。 Thx的幫助! –

+0

閱讀依賴注入可能會有幫助。模式產生的主要原因之一是人們試圖使用模擬對象進行測試,並遇到了遇到的確切問題。而且,是的,答案是:不要在控制器中創建數據庫控制器,使其可以設置要使用的數據庫控制器。 –