OCMock valueForKey因NSPredicate而失败

时间:2012-06-07 17:10:24

标签: objective-c ocmock

在我正在测试的代码中,我有一个NSPredicate,我正在过滤一个数组:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"status == %d || status == %d", FVFileReadyStatus, FVFileWaitingStatus];
[myArray filterUsingPredicate:predicate];

我有一个返回模拟的方法,最终会添加到myArrayFVFileStatus是一个typedef枚举。因为我正在使用谓词,谓词正在调用valueForKey,所以我需要将其存根:

-(id)mockFVFileHandleWithStatus:(FVFileStatus)status {
    id mock = [OCMockObject mockForClass:[FVFileHandle class]];
    [[[mock stub] andReturnValue:OCMOCK_VALUE(status)] valueForKey:[OCMArg checkWithSelector:@selector(isEqualToString:) onObject:@"status"]];
    return mock;
}

当我运行测试时,它在过滤器上失败了。我得到NSInvalidArgumentException - Reason: Return value does not match method signature

我不确定如何设置存根,以便它可以与NSPredicate一起使用。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

非常接近。设置存根的正确方法如下:

[[[mock stub] andReturn:OCMOCK_VALUE(status)] valueForKey:[OCMArg checkWithSelector:@selector(isEqualToString:) onObject:@"status"]];

这一开始可能看起来有点反直觉,因为您尝试存根的属性属于 int 类型,因此您需要使用 andReturnValue:< / strong>即可。

但是,在模拟对象上调用的实际方法不是状态,而是 valueForKey:,后者的返回类型是 id 。因此,当使用 andReturnValue:时,存根被设置为返回原始值,然后在被要求提供对象时进行投诉。顺便说一下,错误信息可能更清楚,我会调查一下。

您仍然可以使用 OCMOCK_VALUE 宏来设置值对象,但是使用 andReturn:,您告诉存根返回该值对象,而不是包含在其中的原语,与 valueForKey:的返回类型兼容。