Testing with CocoaPods

<Test Specifications

As of CocoaPods 1.3.0 pods may now provide test specifications (or test specs for short). Test specifications can be used to describe the test sources for a given pod.

Here's an example CoconutLib.podspec, an imaginary library that defines a test spec:

Pod::Spec.new do |s|
  s.name         = 'CoconutLib'
  s.version      = '1.0'
  s.authors      = 'Coconut Corp', { 'Monkey Boy' => '[email protected]' }
  s.homepage     = 'http://coconut-corp.local/coconut-lib.html'
  s.summary      = 'Coconuts For the Win.'
  s.description  = 'All the Coconuts'
  s.source       = { :git => 'http://coconut-corp.local/coconut-lib.git', :tag => 'v1.0' }
  s.license      = {
    :type => 'MIT',
    :file => 'LICENSE',
    :text => 'Permission is hereby granted ...'
  }
  s.source_files        = 'Classes/*.{h,m}'

  s.test_spec 'Tests' do |test_spec|
    test_spec.source_files = 'Tests/*.{h,m}'
    test_spec.dependency 'OCMock' # This dependency will only be linked with your tests.
  end  
end

Test specs are treated just like subspecs in terms of consuming them but they are different in how they are configured in the generated Pods.xcodeproj. Test spec sources and dependencies will not be included in the CoconutLib sources. You may choose to have multiple test specs in a podspec if you'd like to describe different parts of your pod with different test sources and dependencies.

In your Podfile you can bring the test specification as such:

target 'MyApp' do
  use_frameworks!
  pod 'CoconutLib', '~> 1.0', :testspecs => ['Tests'] 
end

When you pod install this will automatically create a test target within the Pods.xcodeproj for the CoconutLib pod. You may choose to select that scheme and build and run your tests!

<Linting

pod lib lint and pod spec lint now have support for building and running your tests automatically when you lint your podspec. For example, linting the CoconutLib.podspec will automatically setup and run your tests provided by the given test specs. If you want to skip this step you may use the --skip-tests flag.

pod lib lint CoconutLib.podspec --skip-tests

<App Hosts

With CocoaPods 1.4.0, support for app hosts was added to test specs. If your tests require an app host in order to execute properly then you can designate this in your podspec as such:

  s.test_spec 'Tests' do |test_spec|
    test_spec.requires_app_host = true
    test_spec.source_files = 'Tests/*.{h,m}'
  end

Note that CocoaPods will only generate a single app host that can be used by multiple test specs.