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/ ) – 有LogicTestsInfo.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"];