我有一個核心數據應用程序在其一個提取請求中使用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時,它返回一個空數組。我非常想知道這個問題,但我不確定如何有效地調試這個。
所以我有兩個問題在這裏,真正做到:
- 是否有一個原因,我在這裏失蹤,爲什麼使用filteredArrayUsingPredicate針對實施中所引用的屬性mock對象(一NSProxy子類的實例)的陣列謂詞?
- 假設沒有明顯的原因,任何人都可以提出一個有效的方法來調試這個來看看它是什麼被過濾的.ArrayUsingPredicate正在評估這裏以及它爲什麼會失敗嗎?
感謝您的幫助,您可以提供
蒂姆,因爲這些屬性,你寫你自己的訪問器,並添加日誌記錄看到他們被過濾器調用? Andrew – adonoho
那麼,確定它們是否被調用是有點困難的,因爲我正在使用OCMock去除方法,所以我實際上並沒有在模擬對象中編寫訪問器。但經過很多試驗後,我用另一種方式對存儲的屬性進行了存根錯誤,但我能夠驗證訪問器實際上並未被調用。我不得不另外爲我試圖訪問的每個屬性存儲valueForKey方法。 –