无法在Kiwi中的模拟CLLocation对象上存根时间戳

时间:2013-08-04 12:24:15

标签: ios objective-c mocking kiwi

我正在写一些测试,我需要

  • 存根调用模拟CLLocationManager以返回特定内容 CLLocation
  • 反过来说CLLocation需要有一个时间戳 是过去的

创建CLLocation实例很简单,但它上面的timestamp属性是只读的,并固定在创建实例的时间点。 所以,我计划创建一个模拟CLLocation,并将时间戳调用存根。

所以,代码看起来像这样:

[[CLLocationManager stubAndReturn:theValue(YES)] locationServicesEnabled];
NSDate *oldDate = [IPPOTestSupportMethods createNSDateSubtractingDays:2];
//TODO - Why is line below failing
[[expectedOldLocationMock stubAndReturn:oldDate] timestamp];
[[locationMgrMock stubAndReturn:expectedOldLocationMock] location];

总之,我有一个CLLocationManager模拟器,我创建了一个比今天提前两天的NSDate。我希望在致电

时返回该日期
[cllocationmock timestamp];

然而,我正在接受ARC语义问题。

IPPOLocationManagerDelegateImplKiwiTests.m:203:33: Multiple methods named 'timestamp' found with mismatched result, parameter type or attributes

这是新西兰的问题,还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

我能够通过使用选择器 - 存根技术而不是消息模式技术来完成这项工作:

[expectedOldLocationMock stub:@selector(timestamp) andReturn:oldDate];

使用消息模式技术(stubAndReturn:)时,我得到的错误与您相同:

  

找到了名为'timestamp'的多个方法,其中包含不匹配的结果,参数类型或属性

如果在问题导航器中检查此错误,您应该看到它指向两个声明timestamp选择器的不同类:class UIAcceleration声明

@property(nonatomic,readonly) NSTimeInterval timestamp;

...和类CLLocation声明

@property(readonly, nonatomic) NSDate *timestamp;

注意“消息模式”存根技术的结构:

[[someObject stubAndReturn:expectedValue] messageToStub]

stubAndReturn:方法返回类型为id的不透明对象。因此,它等同于:

id invocationCapturer = [someObject stubAndReturn:expectedValue];
[invocationCapturer messageToStub];

此处,“messageToStub”是您的timestamp选择器。所以你要说的是将消息timestamp发送给id类型的未知对象。因为在编译时我们没有对正在发送时间戳选择器的对象的类型进行断言,所以它无法知道您所指的那个时间戳属性的版本,因此无法确定正确的返回类型。

只需执行以下操作即可重现相同的错误:

id someUnknownObject;
[someUnknownObject timestamp];

结论是,当相同选择器名称的可见声明不同时,消息模式存根技术将无法正常工作。