Нераспознанный селектор SenTestCase для категории
Я создал новый проект Cocoa Touch Static Library с модульным тестированием в XCode 4 и добавил категорию:
// NSString+Inflections.h
@interface NSString (Inflections)
- (NSString *)pluralize;
@end
// NSString+Inflections.m
@implementation NSString (Inflections)
- (NSString *)pluralize { return self; }
@end
затем добавила соответствующую инструкцию импорта в мои тестовые примеры и написала следующий тест:
- (void)testPluralize
{
NSString *test = @"person";
NSString *expected = @"people";
NSString *actual = [test pluralize];
STAssertEqualObjects(actual, expected, @"Whoops");
}
Однако это приводит к сбою моих тестов (не сбой) с помощью "непризнанного селектора, отправленного экземпляру".
Как проверить категорию внутри библиотеки?
Я сжал и загрузил полный проект здесь, если мое описание неадекватно.
Ответы
Ответ 1
Я сам сам искал ответ на эту проблему и нашел (я считаю) более простое решение, которое не требует запоминания добавления ссылки в список источников компиляции всякий раз, когда к проекту добавляется новый класс категорий.
В настройках тестовой целевой сборки добавьте -ObjC
к значению флага Linking/Other Linker.
Дальнейшее объяснение того, почему эта ошибка на самом деле происходит, можно найти в Apple Reference.
Ответ 2
Изменить: обязательно этот ответ о unit test не найти файлы
+1 Для загрузки проекта. Проблема заключается в том, что ваша тестовая цель не включает NSString + Inflections.m в фазах сборки.
В XCode 4
- Нажмите "Поппи" в верхней части Навигатора
- Выберите "PoppyTests" в разделе "Цели"
- Переход к фазам сборки
- Развернуть источники компиляции
- Нажмите знак +, а затем добавьте NSString + Inflections.m
Затем вы должны получить что-то похожее:
TestSuite '/blahblah/PoppyTests.octest(Tests)' закончил 2011-03-28 21:31:34 +0000. Выполнено 1 тест с 1 отказом (0 неожиданно) в 0,000 (0,002) секунды
Ответ 3
Я также могу подтвердить, что добавление необходимых файлов в тестовый проект "Сборка фаз" > сборка "Сбор источников" решает эту проблему. Спасибо, куча!
Однако, когда я попытался использовать метод -all_load, я начал получать кучу ошибок, например _CGSizeZero - undefined для архитектуры i386. Оказывается, что некоторый код, как этот, где я использую CGSizeZero в одном из моих классов, может сделать второй подход.
Как только я заменил CGSizeZero на CGSizeMake (0, 0), однако, второй подход работал отлично.
Ответ 4
У меня была такая же ситуация, когда я работал в проекте Objective-c. Я сделал следующие шаги, и все прошло хорошо.
1) Выберите цель проекта и goto.
2) выберите Test target и добавьте -ObjC
, как показано на изображении.
![введите описание изображения здесь]()
3) Теперь попробуйте запустить модуль XCTest.