1

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

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

创建 CLLocation 的实例很容易,但它的时间戳属性是只读的,并且固定到创建实例的时间点。所以,我计划创建一个模拟 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

这是 Kiwi 的问题,还是我遗漏了什么?

4

1 回答 1

1

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

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

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

发现多个名为“timestamp”的方法,结果、参数类型或属性不匹配

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

@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到 type 的未知对象id。由于在编译时我们没有断言发送时间戳选择器的对象的类型,它无法知道您指的是哪个版本的时间戳属性,因此它无法确定正确的返回类型。

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

id someUnknownObject;
[someUnknownObject timestamp];

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

于 2013-08-04T14:10:37.253 回答