unit testing - OCUnit & NSBundle
unit-testing resources (1)
Creé la prueba OCUnit en concordancia con la "Guía de desarrollo de iPhone". Esta es la clase que quiero probar:
// 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 (objetivo 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
Todos los marcos necesarios, "myClass.m" y las imágenes agregadas al objetivo. Pero en la compilació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 luego muestra la imagen correcta. También he comprobado 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?
Encontré solo una solución para este problema.
Cuando construyo mis pruebas unitarias, la ruta del paquete principal no es igual al paquete de mi proyecto (archivo .app creado). Además, no es igual al paquete LogicTests (creado archivo LogicTests.octest
).
El 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 obtener paquetes directos:
NSString *path = [[NSBundle bundleForClass:[myClass class]] pathForResource:name ofType:@"png"];
en lugar de
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"png"];