Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法在Kiwi中的模拟CLLocation对象上存根时间戳_Ios_Objective C_Mocking_Kiwi - Fatal编程技术网

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需要有一个时间戳 这是过去的事了
创建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];
然而,我得到和弧语义问题

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”的方法,其结果、参数类型或属性不匹配

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

@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”的方法,其结果、参数类型或属性不匹配

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

@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的方式做这件事,因为我个人觉得它更可读。所以,解释清楚了为什么我不能使用它。有时看起来更具可读性,它的优点是您可以使存根特定于参数值的特定组合。