Я пытаюсь погрузиться во вполне откровенно ужасный мир поблочного тестирования с помощью XCode (такой замысловатый процесс, которым это кажется.)
В основном у меня есть этот тестовый класс, пытаясь протестировать мой класс Show.h
#import
#import "Show.h"
@interface ShowTest : GHTestCase { }
@end
@implementation ShowTest
- (void)testShowCreate
{
Show *s = [[Show alloc] init];
GHAssertNotNil(s,@"Was nil.");
}
@end
Однако, когда я пытаюсь создать, и запускать мои тесты это стонет с этой ошибкой: -
Неопределенные символы:
"$ _OBJC_CLASS_ _Show", ссылаемый от:
__objc_classrefs__DATA@0 in ShowTest.o
ld: символ (символы), не найденный
collect2: ld возвратил 1 статус выхода
Теперь я предполагаю, что это - связывающаяся ошибка. Я пытался выполнить каждый шаг в инструкциях, расположенных здесь: -
http://github.com/gabriel/gh-unit/blob/master/README.md
И шаг 2 этих инструкций смутил меня: -
В Целевом 'Тестовом' окне Info, вкладке "Общие":
Добавьте связанную библиотеку, под разделом Mac OS X 10.5 SDK, выберите GHUnit.framework
Добавьте связанную библиотеку, выберите свой проект.
Добавьте прямую зависимость и выберите свой проект. (Это заставит Ваше приложение или платформу создавать перед тестовой целью.)
Как я, как предполагается, добавляю свой проект к связанному списку библиотеки, когда все он принимает его .dylib, .framework и.o файлы?
Если целевой объект, который вы тестируете, является приложением, вам необходимо вручную включить файлы Show.h / m как в основную цель, так и в тест. цель.
Я также обновил README, чтобы отразить это:
Test
. Приносим извинения за недоразумение! Необходимость включать файлы в обе цели - не лучший вариант.
Каким-то образом пример Apple работает без дублирования файлов .m в целевом объекте.
Загрузите образец кода для модульного тестирования Apple (iPhoneUnitTests.zip) здесь:
http://developer.apple.com/IPhone/library/samplecode/iPhoneUnitTests/Introduction/Intro.html
Щелкните цель CalcTests . В эту цель входит только CalcTests.m.
Постройте цель. Он строится без ошибок ссылок для CalcAppDelegate или других классов.
Какая магия заставляет это работать?
У вас должна быть @implementation
для Show
].
Или вы можете использовать
Show* s = [[objc_getClass("Show") alloc] init];
...
или
Show* s = [[NSClassFromString(@"Show") alloc] init];
...
для разрешения класса во время выполнения.