2013-08-04 1 views
1

Я пишу некоторые тесты, где мне нужноНевозможно окурок метки времени на макет объекта CLLocation в Киви

  • заглушки вызов макета CLLocationManager вернуть ОПРЕДЕЛЕННУЮ CLLocation
  • и в своей очереди, что CLLocation должен иметь метку времени, что в последние

Создание экземпляров CLLocation достаточно легко, но свойство временной метки на нем только для чтения и фиксируется на момент времени, когда был создан экземпляр. Итак, я планировал создать макет CLLocation, а также отключить вызов timestamp.

Итак, код выглядит следующим образом:

[[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

Я был в состоянии сделать эту работу с помощью селектора-гася метод вместо техники шаблон сообщения:

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

я получаю ту же ошибку, как вы при использовании метода шаблона сообщения (stubAndReturn:):

Различные методы, названные «метка времени» найдено с несовпадением результата, типа параметров или атрибутов

Если вы проверяете эту ошибку в выпуске Navigator, вы должны увидеть, что это указывает на два разных классов, которые декларируют селектор timestamp: класс UIAcceleration объявляет

@property(nonatomic,readonly) NSTimeInterval timestamp; 

... и класс CLLocation объявляет

@property(readonly, nonatomic) NSDate *timestamp; 

Примечание структура «шаблон сообщения» Stubbing техники:

[[someObject stubAndReturn:expectedValue] messageToStub] 

метод stubAndReturn: возвращает O paque объект типа id. Таким образом, это эквивалентно следующему:

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

Здесь "messageToStub" ваш селектор timestamp. Поэтому вы говорите, чтобы отправить сообщение timestamp неизвестному объекту типа id. Поскольку во время компиляции мы не делаем никаких утверждений о типе объекта, отправляемого селектором временной метки, он не может знать, какую версию этого свойства метки времени вы имеете в виду, и, следовательно, он не может определить правильный тип возврата.

Вы можете воспроизвести ту же самую ошибку, просто делает это:

id someUnknownObject; 
[someUnknownObject timestamp]; 

Вывод о том, что сообщение-модель гася метод просто не будет работать хорошо, когда есть разные заявления, видимые с тем же именем селектора.

+0

Спасибо. Это сработало для меня. Также спасибо за объяснение. Я использовал метод stubAndReturn, потому что я лично нашел его более читаемым. Итак, объяснение дает понять, почему я не могу его использовать. –

+0

[stubAndReturn] (https://github.com/allending/Kiwi/wiki/Mocks-and-Stubs) иногда кажется более читаемым, и он имеет то преимущество, что вы можете сделать заглушку, специфичную для определенной комбинации значений параметров , –

 Смежные вопросы

  • Нет связанных вопросов^_^