isKindOfClass: возвращает ложный минус в комплекте модульного теста - PullRequest
24 голосов
/ 22 апреля 2011

Итак, у меня есть экземпляр MyViewController в подробном представлении UISplitViewController.Я запускаю модульное тестирование, чтобы проверить, содержит ли подробный вид правильный тип представления.

Я проверяю тип контроллера в модульном тесте с помощью следующего:

[controller isKindOfClass:[MyViewController class]];

Однако,метод isKindOfClass всегда возвращает NO

Когда я помещаю объект в отладчик, я получаю следующее:

(gdb) po controller
<MyViewController: 0xb31c4d0>

Я также пробовал метод isMemberOfClass:, он дает те же результаты.Кто-нибудь может объяснить, почему это произошло?

РЕДАКТИРОВАТЬ: Итак, прочитав статью, опубликованную Ником Уивером, я понял, что включаю исходные файлы моего приложения в фазу компиляции исходных текстов комплекта тестового пакета.Это также указывалось в журнале с помощью инструкций, подобных следующим:

Class MyViewController is implemented in both /Users/jdoe/Library/Application Support/iPhone Simulator/4.3.2/Applications/670A077A-BAD8-4FA6-945A-851F33114CF5/MyApp.app/MyApp and /Users/jdoe/Library/Developer/Xcode/DerivedData/MyApp-drxyfejeattjwgantzesgensnlnx/Build/Products/Debug-iphonesimulator/MyAppTests.octest/MyAppTests. One of the two will be used. Which one is undefined.

Однако, когда я удаляю исходные файлы из фазы сборки исходных текстов компиляции тестового пакета, я получаю ошибку компоновщика, которая выглядит следующим образом:

Undefined symbols for architecture i386:
"_OBJC_CLASS_$_MyViewController", referenced from:
  objc-class-ref in _MyViewControllerTests.o
 (maybe you meant: _OBJC_CLASS_$__MyViewControllerTests)

Ответы [ 3 ]

13 голосов
/ 03 мая 2011

Как уже упоминалось в моем вопросе, я понял, что неправильно включил исходные файлы приложения в фазу компиляции исходных текстов тестового комплекта.После удаления исходных файлов из этой фазы сборки я исправил ошибку компоновщика отсутствующих символов, изменив настройку сборки «Скрытые символы по умолчанию» на «Нет» для конфигурации отладки

Xcode build settings

Это устранило ошибку компоновщика и означало, что я больше не включал дубликаты исходных файлов


Примечание: Кроме того, обязательно установите «Host Target» для цели теста на вкладке Info в Xcodeпоэтому он будет тянуть исходники компиляции оттуда

4 голосов
/ 22 апреля 2011

Может быть, это полезно, первый ответ: isKindOfClass и NSStringFromClass не согласны с UIApplicationDelegate .

0 голосов
/ 05 марта 2018

У меня была такая же проблема с одним из моих приложений, я исправил ее, удалив файл .m из Test target.В вашем случае удаление MyViewController.m из цели теста решит вашу проблему.Откройте ваш файл .m. Перейдите к правому навигатору в Xcode и снимите отметку с подписки Target для проверки цели.Проблема в том, что компилятор компилирует два MyViewController.m (один для приложения, другой для теста) и .class может возвращать разные объекты.

...