2012-01-21 47 views
1

我有一個核心數據應用程序在其一個提取請求中使用NSPredicate。這個謂詞的定義如下:如何調試與模擬對象失敗的NSPredicate?

NSDictionary *teamsParams = [NSDictionary dictionaryWithObject:teamArray forKey:@"TEAMS"]; 
NSPredicate *predicate = [[NSPredicate predicateWithFormat:@"(homeTeam IN $TEAMS) AND (awayTeam IN $TEAMS)"] predicateWithSubstitutionVariables:teamsParams] 

我將此謂詞獲取請求並運行它和它的作品,我希望:至少它與數據量有限我在這有我的數據存儲時間。

我現在正在嘗試爲此代碼編寫一組單元測試。要做到這一點,我使用OCMock創建的NSManagedObjectContext其executeFetchRequest用我自己的測試實現掐滅:

id contextMock = [OCMockObject mockForClass:[NSManagedObjectContext class]]; 
[[[contextMock stub] andCall:@selector(stubbedExecuteFetchRequest:error:) onObject:self] executeFetchRequest:[OCMArg any] error:(NSError * __autoreleasing *) [OCMArg anyPointer]]; 

- (NSArray *)stubbedExecuteFetchRequest:(NSFetchRequest *)request error:(NSError **)error {  
    // allGames is an array containing a list of "mocked" game instances 
    NSArray *result = [allGames filteredArrayUsingPredicate:[request predicate]]; 
    return result; 
} 

所以基本上,我試圖採取被定義爲對核心數據運行提取請求的NSPredicate ,並針對一系列模擬對象運行它。被嘲笑的對象都實現了主隊和客隊的方法,所以就謂詞而言,這應該起作用。不幸的是,當對我的dta數組運行filteredArrayUsingPredicate時,它返回一個空數組。我非常想知道這個問題,但我不確定如何有效地調試這個。

所以我有兩個問題在這裏,真正做到:

  1. 是否有一個原因,我在這裏失蹤,爲什麼使用filteredArrayUsingPredicate針對實施中所引用的屬性mock對象(一NSProxy子類的實例)的陣列謂詞?
  2. 假設沒有明顯的原因,任何人都可以提出一個有效的方法來調試這個來看看它是什麼被過濾的.ArrayUsingPredicate正在評估這裏以及它爲什麼會失敗嗎?

感謝您的幫助,您可以提供

+0

蒂姆,因爲這些屬性,你寫你自己的訪問器,並添加日誌記錄看到他們被過濾器調用? Andrew – adonoho

+0

那麼,確定它們是否被調用是有點困難的,因爲我正在使用OCMock去除方法,所以我實際上並沒有在模擬對象中編寫訪問器。但經過很多試驗後,我用另一種方式對存儲的屬性進行了存根錯誤,但我能夠驗證訪問器實際上並未被調用。我不得不另外爲我試圖訪問的每個屬性存儲valueForKey方法。 –

回答

3

我設法弄清楚大多數發生了什麼事在這裏的。我在這裏遇到的主要問題是,當我使用包含諸如「homeTeam」之類的謂詞的filteredArrayUsingPredicate時,通過使用「homeTeam」鍵調用它們的valueForKey方法來評估我的數組對象。我期望這個valueForKey調用返回homeTeam訪問器方法的值,但由於某些原因,我的模擬對象沒有發生(這是我仍然不明白這一點的部分)

一旦我也樁了valueForKey方法在我的模擬對象,然後通過一個OCMock錯誤(或限制?)記錄here,我能夠讓我的測試工作,