我有一个核心数据应用程序,它在其中一个获取请求中使用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定义为针对核心数据获取请求运行,并针对模拟对象数组运行它。模拟对象都实现了homeTeam和awayTeams方法,因此就谓词而言,这应该有效。不幸的是,当对我的dta数组运行filteredArrayUsingPredicate时,它返回一个空数组。我真的很难解决这个问题,而且我不确定如何有效地调试这个。
所以我在这里有两个问题:
感谢您提供的任何帮助
答案 0 :(得分:3)
我已经设法弄清楚这里发生的大部分事情。我在这里遇到的主要问题是,当我将filteredArrayUsingPredicate与包含诸如" homeTeam"这样的术语的谓词一起使用时,我的数组对象通过使用&#34键调用它们的valueForKey方法来评估该谓词。 ; homeTeam&#34 ;.我原本期望这个valueForKey调用返回homeTeam访问器方法的值,但由于某些原因,我的模拟对象没有发生这种情况(我仍然不了解这个部分)
一旦我在我的模拟对象上存储了valueForKey方法,然后通过OCMock错误(或限制?)记录了here,我能够让我的测试工作,