GH-Unit для модульного тестирования кода Objective-C, почему я получаю ошибки компоновки? - PullRequest
5 голосов
/ 10 апреля 2010

Я пытаюсь погрузиться в совершенно откровенно ужасный мир модульного тестирования с использованием XCode (такой сложный процесс, как кажется.)

В основном у меня есть этот тестовый класс, пытающийся протестировать мой класс Show.h

#import <GHUnit/GHUnit.h>
#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 этих инструкций смутил меня: -

В информационном окне Target 'Tests', вкладка General:

Добавьте связанную библиотеку, в разделе Mac OS X 10.5 SDK выберите GHUnit.framework

Добавьте связанную библиотеку, выберите ваш проект.

Добавьте прямую зависимость и выберите ваш проект. (Это приведет к тому, что ваше приложение или фреймворк будут собраны до цели тестирования.)

Как мне добавить свой проект в список связанных библиотек, когда все это принимает .dylib, .framework и .o файлы?

Ответы [ 3 ]

7 голосов
/ 10 апреля 2010

Если цель, которую вы тестируете, является приложением, вам нужно будет вручную включить файлы Show.h / m как в вашу главную цель, так и в вашу цель тестирования.

Я также обновил README, чтобы отразить это:

  • Если вашей основной целью является библиотека: добавьте связанную библиотеку и выберите свою основную цель; Это делается для того, чтобы вы могли связать свою контрольную цель с основной, и тогда вам не нужно вручную включать исходные файлы в обе цели.
  • Если вашей основной целью является приложение, вам нужно будет вручную включить эти исходные файлы в проект Test.

Извините за путаницу! Включение файлов в обе цели не является идеальным.

0 голосов
/ 10 апреля 2010

Каким-то образом пример Apple работает без дублирования файлов .m в целевой папке.

Загрузите образец кода для тестирования устройства Apple (iPhoneUnitTests.zip) здесь:

http://developer.apple.com/IPhone/library/samplecode/iPhoneUnitTests/Introduction/Intro.html

Нажмите на цель CalcTests. Только CalcTests.m находится в этой цели.

Постройте цель. Он создает без каких-либо ошибок ссылок для CalcAppDelegate или других классов.

Какая магия делает эту работу?

0 голосов
/ 10 апреля 2010

Вы должны иметь @implementation для Show.

Или вы можете использовать

Show* s = [[objc_getClass("Show") alloc] init];
...

или

Show* s = [[NSClassFromString(@"Show") alloc] init];
...

для разрешения класса во время выполнения.

...