11
votes

I've been trying to load a simple text file in a unit test for an iOS app.

NSString* resourcePath = [[NSBundle mainBundle] pathForResource: @"stopPointsInCircleData" ofType:@"txt"];
NSString* stopPointData = [NSData dataWithContentsOfFile: resourcePath];

My problem is that pathForResource returns nil.

The file stopPointsInCircleData.txt is located in the directory of the test code and the file is listed correctly under "Copy Bundle Resources" in the "Build Phases" of the test target.

I've tried to relax the search by setting ofType to nil, but thet didn't work either.

Any help is very much apprechiated.

2
May it will be simpler to set path manually? NSHomeDirectory() will help you - Nekto
maybe because it is not txt .. have you checked the file format....it might be something else ..rtf? - Shubhank

2 Answers

28
votes

Your problem is that in a unit test target, -mainBundle doesn't refer to the test target bundle but instead to the bundle of the executable in which the test target is injected. In the case of ios test targets, this is your app bundle; in Mac test targets it may either be the app bundle or the OCUnit runner.

You should look for resources in your test target's bundle. Inside a test class, it's done like this:

NSBundle *myBundle = [NSBundle bundleForClass: [self class]];
6
votes

There is simple way to achieve that, you can emulate that bundle path:

Just head to

Project -> TestTarget -> Build Settings -> Unit Testing (Test Host) and just insert:

    $(BUILT_PRODUCTS_DIR)/AppName.app

Happy testing.