【发布时间】:2012-02-15 12:06:37
【问题描述】:
我有一个核心数据应用程序,它在其获取请求之一中使用了 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 在这里评估以及为什么它对我来说失败了?
感谢您提供的任何帮助
【问题讨论】:
-
Tim,因为这些是属性,您是否编写了自己的访问器并添加了日志记录以查看它们是否被过滤器调用?安德鲁
-
嗯,确定它们是否被调用有点困难,因为我使用 OCMock 来存根方法,所以我实际上并没有在模拟中编写访问器目的。但是经过大量试验后,使用替代方法对我正在访问的属性进行存根的错误,我能够验证访问器实际上没有被调用。我还必须为我尝试访问的每个属性额外删除 valueForKey 方法。
标签: objective-c core-data nspredicate ocmock