11

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.

Chris
  • 3,192
  • 4
  • 30
  • 43

2 Answers2

28

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

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.

Carlos Ricardo
  • 2,058
  • 25
  • 32
  • 1
    I believe this answer is way better then the accepted one! – Dannie P Jan 31 '15 at 22:35
  • What would it be for a framework? I tried `$(BUILT_PRODUCTS_DIR)/FrameworkName.framework` but got an error: "Could not find test host for ..." – Morgan Nov 21 '19 at 20:49