kpo*_*wer 38 resources unit-testing ocunit nsbundle
我根据"iPhone开发指南"创建了OCUnit测试.这是我要测试的类:
// 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
Run Code Online (Sandbox Code Playgroud)
我的单元测试(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
Run Code Online (Sandbox Code Playgroud)
所有必要的框架,"myClass.m"和图像添加到目标.但在构建时我有一个错误:
[[myClass alloc] initWithIndex:0] raised Image (image_0) with path \"(null)\" for current index (0) wasn't found.. myClass initialization error
此代码(初始化)在应用程序本身(主要目标)中工作正常,稍后显示正确的图像.我也检查了我的项目文件夹(build/Debug-iphonesimulator/LogicTests.octest/) -有LogicTests,Info.plist和必要的映像文件(image_0.png就是其中之一).
怎么了?
kpo*_*wer 127
找到这个问题的唯一解决方案.
当我构建我的单元测试时,主包的路径不等于我的项目的包(创建.app文件).而且,它不等于LogicTests包(创建的LogicTests.octest文件).
单元测试的主要包就像/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Developer/usr/bin.这就是为什么程序找不到必要的资源.
最终的解决方案是直接捆绑:
NSString *path = [[NSBundle bundleForClass:[myClass class]] pathForResource:name ofType:@"png"];
Run Code Online (Sandbox Code Playgroud)
代替
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"png"];
Run Code Online (Sandbox Code Playgroud)