I'm trying to use Swift's @testable
declaration to expose my classes to the test target. However I'm getting this compiler error:
Intervals
is the module that contains the classes I'm trying to expose. How do I get rid of this error?
I'm trying to use Swift's @testable
declaration to expose my classes to the test target. However I'm getting this compiler error:
Intervals
is the module that contains the classes I'm trying to expose. How do I get rid of this error?
In my case I used a custom build configuration for testing (called Test
) and also cocoapods
as a dependency manager
I had to add the following lines to the end of my Podfile
to enable testability
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
if config.name == 'Test'
config.build_settings['ENABLE_TESTABILITY'] = 'YES'
end
end
end
end
By default cocoapods
sets ENABLE_TESTABILITY
to YES
only for Debug
builds
This is probably because your main target Enable Testability
is set to NO
. You should set it to YES
in the debug scheme (which is used for running your tests).
If you use Carthage, this problem can be caused by importing frameworks with @testable
, because they are built with a release scheme.
Most of the times it's bad practice to import frameworks with that prefix, so you could avoid it.
If you can't, you should Enable Testability
in the frameworks' release scheme. https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326
If by any chance you have
install! 'cocoapods',
generate_multiple_pod_projects: true,
incremental_installation: true
Then, this is the way to do it.
# generated_projects only returns results if the we run "pod install --clean-install"
# or install a pod for the first time
installer.generated_projects.each do |project|
project.build_configurations.each do |configuration|
configuration.build_settings["ENABLE_TESTABILITY"] = "YES"
end
end
I'm a beginner and I just can't remember where all the settings and options are in Xcode. So I always feel frustrated when I see "you can set xxx to yyy ..." in answers to this kind of question. Where are those xxx in Xcode? and What are those yyy? We need a map showing how we get things done, but not another clue, like xxx. It seems we are Nicolas Cage in National Treasure!
Thanks for all the clues here, very much! You really help me. But I have a concrete answer here (which is actually from you):
I started getting this error when running tests using Bitrise.
Unlike other users says, this is not per Target
basis, or per Schema
basis, it is per Configuration
basis.
Select Target
-> Build Settings
tab -> look for testability
-> Enable it on the Configuration that you are using.
Please notice that Apple recommends to enable this on the configuration that you are using for debugging, not for AppStore.
In your main target you need to set the
Enable Testability
build option to Yes.As per the comment by @earnshavian below, this should only be used on debug builds as per apple release notes: "The Enable Testability build setting should be used only in your Debug configuration, because it prohibits optimizations that depend on not exporting internal symbols from the app or framework" https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326