2010-06-18 15 views
38

Utworzono test OCUnit zgodnie z "Przewodnikiem programisty iPhone'a". Tutaj jest klasa chcę testu: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 

A moja jednostka-test (target 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 

Wszystkie niezbędne ramy "myClass.m" i zdjęcia dodawane do celu. Ale na kompilacji mam błąd:

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

Ten kod (inicjalizacja) działa dobrze w samej (główny cel) aplikacji i nowszych monitorów poprawny obraz. Sprawdziłem również folder projektu (build/Debug-iphonesimulator/LogicTests.octest/) - są tam LogicTests, Info.plist i niezbędne pliki graficzne (image_0.png jest jednym z nich).

Co jest nie tak?

+2

Building off roztworu kpower, w wymyśliłem następujący [Xcode: TEST vs makra DEBUG preprocesora] (http://stackoverflow.com/questions/6748087/xcode-test-vs-debug-preprocessor-macros/6763597#6763597). – ma11hew28

Odpowiedz

127

Znaleziono tylko jedno rozwiązanie tego problemu.

Kiedy buduję moje testy jednostkowe, ścieżka głównego pakietu nie jest równa pakietowi mojego projektu (utworzony plik. Co więcej, nie jest równy pakietowi LogicTests (utworzony plik LogicTests.octest).

Główna paczka do testów jednostkowych jest podobna do /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Developer/usr/bin. I dlatego program nie może znaleźć niezbędnych zasobów.

I ostateczne rozwiązanie jest dostać bezpośrednie wiązek:

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

zamiast

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

Dziękuję za odpowiedź. Używanie [self class] jest również możliwe, pozostawiając tę ​​linię w następujący sposób: 'NSString * path = [[NSBundle bundleForClass: [self class]] pathForResource: nameType: @" png "];' – Macarse

+1

O ile mi wiadomo, kiedy opracowujesz standardową aplikację na iPhone'a, jedyny pakiet służy do przechowywania wszystkich Twoich źródeł i zasobów. Teoretycznie można tutaj użyć dowolnej "niestandardowej" (stworzonej przez siebie) klasy. Ale nie sprawdziłem tego pomysłu. – kpower

+0

Wielkie dzięki, szukałem tej odpowiedzi przez ostatnie 3 dni – aryaxt

Powiązane problemy