在我正在测试的代码中,我有一个 NSPredicate 并且正在过滤一个数组:
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"status == %d || status == %d", FVFileReadyStatus, FVFileWaitingStatus];
[myArray filterUsingPredicate:predicate];
我有一个返回模拟的方法,它最终会添加到myArray
中。 FVFileStatus
是一个 typedef 枚举。因为我正在使用谓词,所以该谓词正在调用 valueForKey
,因此我需要将其 stub :
-(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
.
我不确定如何设置 stub 以便它可以与 NSPredicate 一起使用。
有人可以帮忙吗?
最佳答案
非常接近。设置 stub 的正确方法如下:
[[[mock stub] andReturn:OCMOCK_VALUE(status)] valueForKey:[OCMArg checkWithSelector:@selector(isEqualToString:) onObject:@"status"]];
一开始这可能看起来违反直觉,因为您尝试 stub 的属性是 int 类型,因此您希望必须使用 andReturnValue:强>。
但是,在模拟对象上调用的实际方法不是 status 而是 valueForKey: ,后者的返回类型是 id嗯>。因此,当使用 andReturnValue: 时, stub 被设置为返回一个原始值,然后在被要求提供对象时发出提示。顺便说一句,错误消息可能更清楚,我会研究一下。
您仍然可以使用 OCMOCK_VALUE 宏来设置值对象,但是通过使用 andReturn: 您是在告诉 stub 返回该值对象,而不是包装在其中的原语,这就是与 valueForKey: 的返回类型兼容的内容。
关于objective-c - OCMock valueForKey 因 NSPredicate 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10936557/