2010-06-18 15 views
38

Ho creato il test OCUnit in concordanza con "Guida allo sviluppo di iPhone". Qui è la classe che voglio prova: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 

E la mia unità-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 

Tutte le strutture necessarie, "myClass.m" e nuove immagini aggiunti a bersaglio. Ma costruire ho un errore:

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

Questo codice (inizializzazione) funziona bene in applicazione stessa (target principale) e visualizza successive immagine corretta. Ho anche controllato la cartella del mio progetto (build/Debug-iphonesimulator/LogicTests.octest/) - ci sono LogicTests, Info.plist e i file di immagine necessari (image_0.png è uno di questi).

Cosa c'è che non va?

+2

Immobile fuori della soluzione di kpower, mi si avvicinò con la seguente [Xcode: TEST vs macro DEBUG preprocessore] (http://stackoverflow.com/questions/6748087/xcode-test-vs-debug-preprocessor-macros/6763597#6763597). – ma11hew28

risposta

127

Trovato solo una soluzione per questo problema.

Quando compilo i miei test unitari, il percorso del bundle principale non è uguale al pacchetto del mio progetto (file .app creato). Inoltre, non è uguale al pacchetto LogicTests (creato nel file LogicTests.octest).

Il bundle principale per i test unitari è qualcosa come /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Developer/usr/bin. Ed è per questo che il programma non riesce a trovare le risorse necessarie.

E la soluzione finale è quello di ottenere fasci diretti:

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

invece di

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

Grazie per la risposta. È anche possibile usare [self class], lasciando questa riga in questo modo: 'NSString * path = [[NSBundle bundleForClass: [self class]] pathForResource: name ofType: @" png "];' – Macarse

+1

Per quanto ne so, quando sviluppi un'applicazione standard per iPhone, l'unico pacchetto è utilizzato per memorizzare tutte le tue risorse e risorse. Quindi, in teoria, qualsiasi classe "personalizzata" (creata da te stesso) può essere utilizzata qui. Ma non ho controllato questa idea. – kpower

+0

Grazie mille, ho cercato questa risposta negli ultimi 3 giorni – aryaxt

Problemi correlati