在我正在测试的代码中,我有一个NSPredicate,我正在过滤一个数组:
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"status == %d || status == %d", FVFileReadyStatus, FVFileWaitingStatus];
[myArray filterUsingPredicate:predicate];
我有一个返回模拟的方法,最终会添加到myArray
。 FVFileStatus
是一个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一起使用。
有人可以帮忙吗?
答案 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:的返回类型兼容。