OCMock - [ответ NSURLSessionDataTask] нераспознанный сбой селектора в iOS 9

Эта проблема

Мы используем OCMock для фиктивных объектов во многих наших модульных тестах. В рамках наших тестов, чтобы увидеть, как наш код реагирует на ответы сервера, мы создаем объект NSURLSessionDataTask, а затем пытаемся использовать для него свойство «response».

Сюжет сгущается

До iOS 9 тесты проходили нормально. Свойство также правильно работает в обычном потоке обратного вызова приложения на iOS 9.

Однако в бета-версиях iOS 9 тесты вылетают во время выполнения с ошибкой «неопознанный селектор отправлен в экземпляр». Свойство присутствует в заголовке фреймворка и не помечено как удаленное в документации.

Этот пример кода иллюстрирует проблему:

NSURLSessionDataTask *task = [[NSURLSessionDataTask alloc] init];

NSLog(@"%@", task.response);

Теория

Кажется, что прямое создание экземпляра класса больше не дает свойства во время выполнения. Похоже, что это свойство является @dynamic свойством, которое генерируется во время выполнения с использованием другого пути создания экземпляра.

Вопрос

Как обойти эту проблему в объектах модульного тестирования OCMock таким образом, чтобы обеспечить обратную совместимость с запуском модульных тестов в iOS 8?

Обновление 1

Обновление OCMock до последней версии (3.1.5) не устраняет проблему.

Для дополнительного контекста, вот как мы используем NSURLSessionDataTask с OCMock. Тесты не проходят на третьей строке.

NSURLSessionDataTask *task = [[NSURLSessionDataTask alloc] init];
OCMockObject *mockTask = [OCMockObject partialMockForObject:task];
[[[mockTask stub] andReturn:urlResponse] response];

person BergQuester    schedule 08.09.2015    source источник
comment
Можете ли вы процитировать фактическую ошибку вместо ее описания? Мне интересно, есть ли какие-то дополнительные подсказки в формулировке.   -  person Phillip Mills    schedule 08.09.2015
comment
Неопознанный селектор — довольно распространенная ошибка при вызове несуществующего метода. Единственная дополнительная информация, которую я еще не указал, — это адрес памяти: «-[NSURLSessionDataTask response]: нераспознанный селектор отправлен экземпляру 0x7fde8e00af60».   -  person BergQuester    schedule 08.09.2015
comment
Актуально: github.com/erikdoe/ocmock/issues/215. Похоже, это было исправлено в OCMock?   -  person dan    schedule 08.09.2015
comment
Обновленный OCMock по-прежнему выдает ошибки, связанные с этим: "-[NSURLSessionDataTask response]: unrecognized selector sent to instance 0x7fbee2f1caf0”и "OCPartialMockObject(NSURLSessionDataTask): cannot stub/expect/verify method 'response' because no such method exists in the mocked class.”   -  person BergQuester    schedule 09.09.2015
comment
Изменения, обсуждавшиеся в github.com/erikdoe/ocmock/pull/215, реализованы в github.com/erikdoe/ocmock/pull/223. Этих изменений нет в OCMock 3.1.5. Они будут включены только в будущий выпуск. Можете ли вы попробовать против мастера, чтобы увидеть, решат ли эти изменения вашу проблему?   -  person Erik Doernenburg    schedule 10.09.2015
comment
@ErikDoernenburg подтвердил, что мастер (по адресу 25e68089e201140332aed16e042afc99c7b7d737) решает эту проблему за меня. Спасибо!   -  person ospr    schedule 23.09.2015


Ответы (1)


Теперь доступен OCMock 3.2, который устраняет эту проблему.

Исправление было "Добавить возможность и тесты для имитации динамических свойств".

person OrangeDog    schedule 09.10.2015