【问题标题】:How to debug an NSPredicate that is failing with mocked objects?如何调试因模拟对象而失败的 NSPredicate?
【发布时间】: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 时,它​​返回一个空数组。我真的很想弄清楚这一点,而且我不确定如何有效地调试这个。

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

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

感谢您提供的任何帮助

【问题讨论】:

  • Tim,因为这些是属性,您是否编写了自己的访问器并添加了日志记录以查看它们是否被过滤器调用?安德鲁
  • 嗯,确定它们是否被调用有点困难,因为我使用 OCMock 来存根方法,所以我实际上并没有在模拟中编写访问器目的。但是经过大量试验后,使用替代方法对我正在访问的属性进行存根的错误,我能够验证访问器实际上没有被调用。我还必须为我尝试访问的每个属性额外删除 valueForKey 方法。

标签: objective-c core-data nspredicate ocmock


【解决方案1】:

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

一旦我还在我的模拟对象上存根 valueForKey 方法,然后解决了记录在 here 的 OCMock 错误(或限制?),我就能够让我的测试正常工作,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    相关资源
    最近更新 更多