如何调试使用模拟对象失败的NSPredicate?

时间:2012-01-21 00:29:48

标签: objective-c core-data nspredicate ocmock

我有一个核心数据应用程序,它在其中一个获取请求中使用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时,它返回一个空数组。我真的很难解决这个问题,而且我不确定如何有效地调试这个。

所以我在这里有两个问题:

  1. 为什么我在这里缺少为什么使用filteredArrayUsingPredicate来对付实现谓词中引用的属性的模拟对象(NSProxy子类的实例)的数组?
  2. 假设没有明显的原因,任何人都可以建议一种有效的调试方式,看看它是filterArrayUsingPredicate在这里评估的是什么以及为什么它失败了?
  3. 感谢您提供的任何帮助

1 个答案:

答案 0 :(得分:3)

我已经设法弄清楚这里发生的大部分事情。我在这里遇到的主要问题是,当我将filteredArrayUsingPredicate与包含诸如" homeTeam"这样的术语的谓词一起使用时,我的数组对象通过使用&#34键调用它们的valueForKey方法来评估该谓词。 ; homeTeam&#34 ;.我原本期望这个valueForKey调用返回homeTeam访问器方法的值,但由于某些原因,我的模拟对象没有发生这种情况(我仍然不了解这个部分)

一旦我在我的模拟对象上存储了valueForKey方法,然后通过OCMock错误(或限制?)记录了here,我能够让我的测试工作,