Ios 无法在Kiwi中的模拟CLLocation对象上存根时间戳
我正在写一些测试,我需要Ios 无法在Kiwi中的模拟CLLocation对象上存根时间戳,ios,objective-c,mocking,kiwi,Ios,Objective C,Mocking,Kiwi,我正在写一些测试,我需要 存根对模拟CLLocationManager的调用,以返回特定的 定位 反过来,CLLocation需要有一个时间戳 这是过去的事了 创建CLLocation的实例非常简单,但是它的timestamp属性是只读的,并且固定在创建实例的时间点上。 因此,我计划创建一个模拟CLLocation,并对时间戳调用进行存根 因此,代码如下所示: [[CLLocationManager stubAndReturn:theValue(YES)] locationServicesE
- 存根对模拟CLLocationManager的调用,以返回特定的 定位
- 反过来,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];
然而,我得到和弧语义问题
IPPOLocationManagerDelegateImplKiwiTests.m:203:33: Multiple methods named 'timestamp' found with mismatched result, parameter type or attributes
这是Kiwi中的一个问题,还是我遗漏了什么?我能够通过使用选择器存根技术而不是消息模式技术来实现这一点:
[expectedOldLocationMock stub:@selector(timestamp) andReturn:oldDate];
[[someObject stubAndReturn:expectedValue] messageToStub]
我在使用消息模式技术时遇到与您相同的错误(stubandreurn:
):
找到多个名为“timestamp”的方法,其结果、参数类型或属性不匹配
如果您在问题导航器中检查此错误,应该会看到它指向两个不同的类,它们声明了时间戳
选择器:classUIAcceleration
声明
@property(nonatomic,readonly) NSTimeInterval timestamp;
…和类CLLocation声明
@property(readonly, nonatomic) NSDate *timestamp;
请注意“消息模式”存根技术的结构:
[expectedOldLocationMock stub:@selector(timestamp) andReturn:oldDate];
[[someObject stubAndReturn:expectedValue] messageToStub]
stubAndReturn:
方法返回类型为id
的不透明对象。因此,它相当于:
id invocationCapturer = [someObject stubAndReturn:expectedValue];
[invocationCapturer messageToStub];
这里,“messageToStub”是您的时间戳
选择器。因此,您的意思是将消息timestamp
发送到类型为id
的未知对象。由于在编译时,我们没有对发送给时间戳选择器的对象的类型做出断言,因此它无法知道您所指的时间戳属性的版本,因此无法确定正确的返回类型
只需执行以下操作,即可重现相同的错误:
id someUnknownObject;
[someUnknownObject timestamp];
结论是,当同一选择器名称的不同声明可见时,消息模式存根技术就不能很好地工作。我能够通过使用选择器存根技术而不是消息模式技术来实现这一点:
[expectedOldLocationMock stub:@selector(timestamp) andReturn:oldDate];
[[someObject stubAndReturn:expectedValue] messageToStub]
我在使用消息模式技术时遇到与您相同的错误(stubandreurn:
):
找到多个名为“timestamp”的方法,其结果、参数类型或属性不匹配
如果您在问题导航器中检查此错误,应该会看到它指向两个不同的类,它们声明了时间戳
选择器:classUIAcceleration
声明
@property(nonatomic,readonly) NSTimeInterval timestamp;
…和类CLLocation声明
@property(readonly, nonatomic) NSDate *timestamp;
请注意“消息模式”存根技术的结构:
[expectedOldLocationMock stub:@selector(timestamp) andReturn:oldDate];
[[someObject stubAndReturn:expectedValue] messageToStub]
stubAndReturn:
方法返回类型为id
的不透明对象。因此,它相当于:
id invocationCapturer = [someObject stubAndReturn:expectedValue];
[invocationCapturer messageToStub];
这里,“messageToStub”是您的时间戳
选择器。因此,您的意思是将消息timestamp
发送到类型为id
的未知对象。由于在编译时,我们没有对发送给时间戳选择器的对象的类型做出断言,因此它无法知道您所指的时间戳属性的版本,因此无法确定正确的返回类型
只需执行以下操作,即可重现相同的错误:
id someUnknownObject;
[someUnknownObject timestamp];
结论是,当同一选择器名称的不同声明可见时,消息模式存根技术就不能很好地工作。谢谢。这对我来说很有用。也谢谢你的解释。我用Stubandreurn的方式做这件事,因为我个人觉得它更可读。所以,解释清楚了为什么我不能使用它。有时看起来更具可读性,它的优点是您可以使存根特定于某个参数值组合。谢谢。这对我来说很有用。也谢谢你的解释。我用Stubandreurn的方式做这件事,因为我个人觉得它更可读。所以,解释清楚了为什么我不能使用它。有时看起来更具可读性,它的优点是您可以使存根特定于参数值的特定组合。