我有一个核心数据应用程序,它在其获取请求之一中使用 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 时,它返回一个空数组。我真的很想弄清楚这一点,而且我不确定如何有效地调试这个。
所以我在这里有两个问题,真的:
- 我在这里遗漏了为什么对实现谓词中引用的属性的模拟对象数组(NSProxy 子类的实例)使用filteredArrayUsingPredicate 的原因吗?
- 假设没有明显的原因,任何人都可以建议一种有效的方法来调试它,看看它是什么 filtersArrayUsingPredicate 在这里评估以及为什么它对我来说失败了?
感谢您的任何帮助,您可以提供