CocoaPods project structure for unit testing with private components

1k views Asked by At

I am using CocoaPods for a project with the following structure:

Example/
Example/PublicUmbrellaHeader.h
Example/PrivateHeaderForComponent1.h
Example/PrivateHeaderForComponent2.h
Example.podspec
Tests/
Tests/Podfile
Tests/Tests/UnitTestForPrivateComponent1.m
Tests/Tests/UnitTestForPrivateComponent2.m

Tests/Podfile

pod 'Example', :path => '../'

This is not unusual. For example, AFNetworking follows a similar structure. What is different is the need to expose a certain set of headers only to the unit tests.

However, I could not figure out a straightforward way to do this accomplish this. The following method works, but it is not clean in the sense that it requires surgery on the public Podspec.

Example.podspec

s.public_header_files = 'Example/PublicUmbrellaHeader.h'
s.default_subspec = 'Public'
s.subspec 'Public'
s.subspec 'Tests' do |ss|
   ss.public_header_files = 'Example/*.h'
end

Tests/Podfile

pod 'Example', :path => '../'
pod 'Example/Tests', :path => '../'

Is there a simpler way? If not, is it because there is something wrong with what I am trying to accomplish, or simply because CocoaPods does not cater to this use case yet?

1

There are 1 answers

0
Michael McGuire On BEST ANSWER

You can directly modify the test target in your Example project to include the private headers in the Header Search Paths. Just go into your Unit Test target, and under Search Paths -> Header Search Paths, add:

$(inherited) "${PODS_ROOT}/Headers/Private/Example"

In your unit test files, you can include the headers like so:

#import "PrivateHeaderForComponent1.h"
#import "PrivateHeaderForComponent2.h"

rather than the typical #import <Example/PrivateHeaderForComponent1.h>

The downside is you're making assumptions about how CocoaPods lays out the files in the Pods directory, but I would rather do that than change my public podspec file.