2010-06-18 12 views
38

Ich erstellte OCUnit Test in Übereinstimmung mit "iPhone Development Guide". Hier ist die Klasse I zu testen will: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 

Und mein Unit-Test (LogicTests Ziel):

// 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 

Alle notwendigen Rahmenbedingungen, "myClass.m" und Bilder hinzugefügt Ziel. Aber auf Build habe ich einen Fehler:

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

Diese Code (Initialisierung) funktioniert einwandfrei in der Anwendung selbst (Hauptziel) und später zeigt richtiges Bild. Ich habe auch meinen Projektordner (build/Debug-iphonesimulator/LogicTests.octest/) überprüft - es gibt LogicTests, Info.plist und notwendige Bilddateien (image_0.png ist einer von ihnen).

Was ist los?

+2

Gebäude aus der kpower-Lösung, ich kam mit dem Follow-up [Xcode: TEST vs DEBUG Präprozessormakros] (http://stackoverflow.com/questions/6748087/xcode-test-vs-debug-preprocessor-macros/6763597#6763597). – ma11hew28

Antwort

127

Es wurde nur eine Lösung für dieses Problem gefunden.

Wenn ich meine Komponententests erstellen, entspricht der Pfad des Hauptpakets nicht dem Paket meines Projekts (erstellte .app-Datei). Außerdem ist es nicht gleich LogicTests Bundle (erstellt LogicTests.octest Datei).

Hauptbündel für Unit-Tests ist so etwas wie /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Developer/usr/bin. Und deshalb kann das Programm die notwendigen Ressourcen nicht finden.

Und die endgültige Lösung ist die direkte Bündel zu erhalten:

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

statt

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

Danke für Ihre Antwort. Es ist auch möglich, [self class] zu verwenden und diese Zeile wie folgt zu belassen: 'NSString * path = [[NSBundle bundleForClass: [eigene Klasse]] pathForResource: Name des Typs: @" png "];' – Macarse

+1

Soweit ich weiß, wann Sie entwickeln eine Standard-iPhone-Anwendung, das einzige Paket wird verwendet, um alle Ihre Quellen und Ressourcen zu speichern. Theoretisch kann also jede "benutzerdefinierte" (selbst erstellte) Klasse verwendet werden. Aber ich habe diese Idee nicht überprüft. – kpower

+0

Vielen Dank, ich habe nach dieser Antwort für die letzten 3 Tage gesucht – aryaxt