2010-06-18 5 views
38

Я создал тест OCUnit в соответствии с «Руководством по разработке iPhone». Вот класс, я хочу, чтобы тест:OCUnit & NSBundle

// myClass.h 
#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

@interface myClass : NSObject { 
    UIImage *image; 
} 
@property (readonly) UIImage *image; 
- (id)initWithIndex:(NSUInteger)aIndex; 
@end 


// myClass.m 
#import "myClass.m" 

@implementation myClass 

@synthesize image; 

- (id)init { 
    return [self initWithIndex:0]; 
} 

- (id)initWithIndex:(NSUInteger)aIndex { 
    if ((self = [super init])) { 
     NSString *name = [[NSString alloc] initWithFormat:@"image_%i", aIndex]; 
     NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"png"]; 
     image = [[UIImage alloc] initWithContentsOfFile:path]; 
     if (nil == image) { 
      @throw [NSException exceptionWithName:@"imageNotFound" 
       reason:[NSString stringWithFormat:@"Image (%@) with path \"%@\" for current index (%i) wasn't found.", 
        [name autorelease], path, aIndex] 
       userInfo:nil]; 
     } 
     [name release]; 
    } 
    return self; 
} 

- (void)dealloc { 
    [image release]; 
    [super dealloc]; 
} 

@end 

И мой блок-тест (цель LogicTests):

// myLogic.m 
#import <SenTestingKit/SenTestingKit.h> 
#import <UIKit/UIKit.h> 
#import "myClass.h" 

@interface myLogic : SenTestCase { 
} 
- (void)testTemp; 
@end 

@implementation myLogic 

- (void)testTemp { 
    STAssertNoThrow([[myClass alloc] initWithIndex:0], "myClass initialization error"); 
} 

@end 

Все необходимые рамки, "myClass.m" и изображения, добавленные к цели. Но строить у меня есть ошибка:

[[myClass alloc] initWithIndex:0] raised Image (image_0) with path \"(null)\" for current index (0) wasn't found.. myClass initialization error

Этот код (инициализация) отлично работает в самой (главная цель) приложения и более поздних дисплеев правильное изображение. Я также проверил папку проекта (build/Debug-iphonesimulator/LogicTests.octest/) - есть LogicTests, и необходимые файлы изображений (image_0.png - один из них).

Что случилось?

+2

Билдинг от решения kpower, я придумал следующее [Xcode: ТЕСТ против DEBUG макросов препроцессора] (http://stackoverflow.com/questions/6748087/xcode-test-vs-debug-preprocessor-macros/6763597#6763597). – ma11hew28

ответ

127

Найдено только одно решение этой проблемы.

Когда я строю свои модульные тесты, путь основного пучка не совпадает с пулом моего проекта (созданный файл .app). Более того, он не равен пакету LogicTests (создан файл LogicTests.octest).

Основной комплект для модульных испытаний - это что-то вроде /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Developer/usr/bin. И поэтому программа не может найти необходимые ресурсы.

И окончательное решение, чтобы получить прямые связки:

NSString *path = [[NSBundle bundleForClass:[myClass class]] pathForResource:name ofType:@"png"]; 

вместо

NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"png"]; 
+24

Спасибо за ваш ответ. Использование [self class] также возможно, оставив эту строку следующим образом: 'NSString * path = [[NSBundle bundleForClass: [self class]] pathForResource: name ofType: @" png "];' – Macarse

+1

Насколько мне известно, когда вы разрабатываете стандартное приложение для iPhone, единственный комплект для хранения всех ваших источников и ресурсов. Итак, теоретически здесь может быть использован любой «пользовательский» (созданный вами) класс. Но я не проверял эту идею. – kpower

+0

Большое спасибо, я искал этот ответ последние 3 дня – aryaxt

Смежные вопросы