2010-12-03 3 views
4

Хорошо, я потратил около 5 часов, пытаясь понять это. Абсолютно ни одна из прошлых резолюций по темам Stackoverflow не работала для меня, поэтому я надеюсь, что кто-то может дать мне ответ, а не дикую охоту на гусей.

Проблема: У меня есть проект x-кода, который требует модульного тестирования моих пользовательских классов. Я использую X-Code 3.2.5 с iOS SDK 4.2. После нескольких разных способов я не могу выполнить мое модульное тестирование на пользовательских классах. Он отлично работает с примерами Apple.

Пользовательские классы - простые подклассы NSObjects с тривиальными iVars. Мы будем называть класс «Snookie».

Я уже сделал несколько сомнительных резолюций, но хотел бы получить ответ от кого-то, у кого была такая же проблема, с ответом, который имеет смысл.

репликация:

  1. Добавить MyAppTesting единичной цели испытания расслоения.
  2. При получении информации о MyAppTesting добавьте MyApp в качестве прямой зависимости.
  3. Создайте группу под названием «Тесты».
  4. В разделе «Тесты» добавьте класс TestiveC Test Case.
  5. В новом тест случае класса .h, импорт Snookie.h и создать Ивар:
#import <SenTestingKit/SenTestingKit.h> 
#import <UIKit/UIKit.h> 

#import "Snookie.h" 

@interface SnookieTests : SenTestCase { 
    Snookie *snookieObject; 
} 
@end 

В новом тест случае класса .м, Alloc/инициализации Snookie следующим образом:

#import "SnookieTests.h" 


@implementation SnookieTests 

- (void) setUp 
{ 
    snookieObject = [[Snookie alloc] init]; 
} 

- (void) tearDown 
{ 
    [snookieObject release]; 
} 

@end 

ошибка:

"_OBJC_CLASS_$_Snookie", referenced from: 
Objc-class-ref-to-Snookie in SnookieTests.o 
Symbol(s) not found 
Collect2: Id returned 1 exit status 

ответ

4

Что вы думаете linker пытается сказать вам, что он не может найти @implementation для класса Snookie в MyAppTesting или любых связанных с ним фреймворках/библиотеках.

Добавление MyApp в качестве прямой зависимости недостаточно, чтобы сообщить Xcode скомпилировать/связать код с MyApp. Вам необходимо явно добавить файл Snookie.m в вашу цель для MyAppTesting.

+0

В то время, когда я опубликовал это и ваш ответ, я принял другой подход с ТОЧНОЙ той же проблемой. Посмотрите документацию Apple http://developer.apple.com/library/ios/#documentation/Xcode/Conceptual/iphone_development/135-Unit_Testing_Applications/unit_testing_applications.html в разделе «Тестирование приложений». Я выполняю шаги ТОЧНО, импортирую мой заголовок в тест и все равно получаю тот же результат. – Richard 2010-12-03 15:15:13

+1

Нигде в этом примере не говорится о том, как связать классы, которые вы тестируете, с тестовым пакетом. Вам нужно добавить Snookie.m в тестовый комплект. Именно об этом говорит вам ошибка. – JeremyP 2010-12-03 16:36:03

0

kperryua является правильным.

В XCode 5 щелкните по файлу реализации класса для проверки (например, XYZCustomClass.m), убедитесь, что вы видите экран Утилиты (который может отображаться в меню «Вид»> «Утилиты»> «Показать утилиты», если hidden), а затем установите флажок [your tests name] Tests в поле Target Membership. Voila, ваш блок тестирует «OBJC_CLASS_ $ ...», на который ссылается: objc-class-ref in. , ._Tests.o "сообщение об ошибке исчезнет.

4

При добавлении файлов .m в приложение непосредственно к цели тестирования решает проблему, это лишнее и ненужное. Следуйте за the steps outlined here by Two Bit Labs, чтобы заставить его работать. Подводя итог, убедитесь, что ваш ...

  1. test target's Bundle Loader build setting указывает на комплект вашего приложения.
  2. test target's Test Host build setting указывает на комплект вашего приложения.
  3. app target'sSymbols Hidden by Default build setting is NO.
Смежные вопросы