2010-06-18 18 views
38

J'ai créé le test OCUnit en concordance avec "iPhone Development Guide". Voici la classe que je veux tester: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 

Et mon unité-test (objectif de 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 

Tous les cadres nécessaires, "myClass.m" et des images ajoutées à la cible. Mais Surchauffe j'ai une erreur:

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

Ce code (initialisation) fonctionne très bien dans l'application elle-même (cible principale) et affiche plus tard d'image correcte. J'ai également vérifié mon dossier de projet (build/Debug-iphonesimulator/LogicTests.octest/) - il y a LogicTests, Info.plist et les fichiers d'image nécessaires (image_0.png est l'un d'entre eux).

Qu'est-ce qui ne va pas?

+2

bâtiment hors de la solution de kpower, je suis venu avec les éléments suivants [Xcode: TEST vs macros DEBUG préprocesseur] (http://stackoverflow.com/questions/6748087/xcode-test-vs-debug-preprocessor-macros/6763597#6763597). – ma11hew28

Répondre

127

Trouvé une seule solution pour ce problème.

Lorsque je compile mes tests unitaires, le chemin du bundle principal n'est pas égal au bundle de mon projet (fichier .app créé). De plus, il n'est pas égal au bundle LogicTests (fichier LogicTests.octest créé).

Le faisceau principal pour les tests unitaires est quelque chose comme /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Developer/usr/bin. Et c'est pourquoi le programme ne peut pas trouver les ressources nécessaires.

Et la solution finale est d'obtenir des faisceaux directs:

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

au lieu de

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

Merci pour votre réponse. L'utilisation de [self class] est également possible, en laissant cette ligne comme ceci: 'NSString * chemin = [[NSBundle bundleForClass: [self class]] pathForResource: nom deType: @" png "];' – Macarse

+1

Pour autant que je sache, quand vous développez une application iPhone standard, le seul bundle est utilisé pour stocker toutes vos sources et ressources. Donc, théoriquement, n'importe quelle classe "personnalisée" (créée par vous-même) peut être utilisée ici. Mais je n'ai pas vérifié cette idée. – kpower

+0

Merci beaucoup, j'ai cherché cette réponse pour les 3 derniers jours – aryaxt