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?
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.
来源:https://stackoverflow.com/questions/20560540/cocoapods-project-structure-for-unit-testing-with-private-components