2010-06-18 6 views
38

Creé la prueba OCUnit en concordancia con "iPhone Development Guide". Aquí está la clase Quiero prueba: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 

Y mi unidad de prueba (LogicTests objetivo):

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

Todos los marcos necesarios, "myClass.m" e imágenes añadidas al objetivo. Pero en la acumulación Tengo un error:

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

Este código (inicialización) funciona bien en la propia aplicación (objetivo principal) y de imagen correcta pantallas posteriores. También revisé la carpeta de mi proyecto (build/Debug-iphonesimulator/LogicTests.octest/) - hay LogicTests, Info.plist y los archivos de imagen necesarios (image_0.png es uno de ellos).

¿Qué pasa?

+2

edificio fuera de la solución de kpower, me ocurrió lo siguiente [Xcode: PRUEBA vs macros de depuración del preprocesador] (http://stackoverflow.com/questions/6748087/xcode-test-vs-debug-preprocessor-macros/6763597#6763597). – ma11hew28

Respuesta

127

Se encontró una sola solución para este problema.

Cuando construyo mis pruebas unitarias, la ruta del paquete principal no es igual al paquete de mi proyecto (archivo creado .app). Además, no es igual al paquete LogicTests (archivo creado LogicTests.octest).

Paquete principal para pruebas unitarias es algo así como /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Developer/usr/bin. Y es por eso que el programa no puede encontrar los recursos necesarios.

Y la solución final es conseguir paquetes directos:

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

en lugar de

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

Gracias por su respuesta. El uso de [self class] también es posible, dejando esa línea así: 'NSString * path = [[NSBundle bundleForClass: [self class]] pathForResource: name ofType: @" png "];' – Macarse

+1

Por lo que sé, cuando usted desarrolla una aplicación estándar de iPhone, el único paquete se usa para almacenar todas sus fuentes y recursos. Entonces, teóricamente, cualquier clase "personalizada" (creada por ti mismo) se puede usar aquí. Pero no revisé esta idea. – kpower

+0

Muchas gracias, he estado buscando esta respuesta durante los últimos 3 días – aryaxt

Cuestiones relacionadas