objective-c - OCMock valueForKey 因 NSPredicate 失败

标签 objective-c ocmock

在我正在测试的代码中,我有一个 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/

相关文章:

ios - 如何将结构参数与 OCMock 匹配?

ios - OCMock 期望在另一个方法中调用一个方法

objective-c - UINavigationItem 后退按钮触摸区域太大

unit-testing - 如何更改 OCMock stub 的返回值?

ios - OCMock。为什么第二个测试通过了?

ios - 估计距离测量单位

iphone - 是否有任何可用于 Objective-C 的测试 spy 库?

iphone - 可以重新创建 MobileSafari 的后退按钮吗?

ios - Objective-c:UIStackView 的动态大小,取决于它的内容

ios - Restkit对象映射