OCUnit和NSBundle
我创build了与“iPhone开发指南”一致的OCUnittesting。 这是我想要testing的课程:
// 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
和我的unit testing(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
所有必要的框架,“myClass.m”和图像添加到目标。 但在构build我有一个错误:
[[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
是其中之一)。
怎么了?
find这个问题只有一个解决scheme。
当我构build我的unit testing时,主包的path不等于我的项目包(创build的.app文件)。 此外,它不等于LogicTests包(创buildLogicTests.octest
文件)。
unit testing的主包类似于/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Developer/usr/bin
。 这就是为什么程序找不到必要的资源。
最后的解决scheme是直接捆绑:
NSString *path = [[NSBundle bundleForClass:[myClass class]] pathForResource:name ofType:@"png"];
代替
NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:@"png"];