1

我有一个核心数据应用程序,它在其获取请求之一中使用 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 数组运行 filtersArrayUsingPredicate 时,它​​返回一个空数组。我真的很想弄清楚这一点,而且我不确定如何有效地调试这个。

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

  1. 我在这里遗漏了为什么对实现谓词中引用的属性的模拟对象数组(NSProxy 子类的实例)使用filteredArrayUsingPredicate 的原因吗?
  2. 假设没有明显的原因,任何人都可以建议一种有效的方法来调试它,看看它是什么 filtersArrayUsingPredicate 在这里评估以及为什么它对我来说失败了?

感谢您的任何帮助,您可以提供

4

1 回答 1

3

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

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

于 2012-01-22T04:41:22.810 回答