'Module was not compiled for testing' when using @testable
Asked Answered
S

12

177

I'm trying to use Swift's @testable declaration to expose my classes to the test target. However I'm getting this compiler error:

enter image description here

Intervals is the module that contains the classes I'm trying to expose. How do I get rid of this error?

Spatiotemporal answered 11/6, 2015 at 17:36 Comment(0)
N
291

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

Northernmost answered 11/6, 2015 at 21:59 Comment(10)
Hi, I'm getting the same error but not seeing the enable testability option and am using xcode 7. Any idea what I should do?Phylys
@Phylys - You can find the option by selecting the top level project, going to Build Settings, and looking under the Build Options heading.Spatiotemporal
@Spatiotemporal - When i select the top level project, all I see in build options is "debug information format" and "validate build product." When I select the target in build options I see "embedded content contains swift code." That's it. When I search in build settings I cannot find it. Is this because of xcode 7?Phylys
It is possible that you have selected "Basic" in your "Build Settings". If you select "All" on the left side, you will see "Enable Testability"Bethea
Note that if you get this from your Xcode server bot, it might be from the Analyse or Profile stages, which you won't typically run locally. Check the logs.Anserine
@Northernmost suggest adding a note about only using on debug builds 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" developer.apple.com/library/watchos/releasenotes/DeveloperTools/…Tower
How exactly should this work for release builds, where tests will run (so need @testable) but need to submit to the App Store? If Enable Testability is just for debug builds, what is the way around this? Do I have to pull out my test code for release?Engraving
@Northernmost Doesnt work for me. But only when I try to archive binary. Any solution?Stockstill
@Engraving did you ever figure this out? you bring up a good pointOverglaze
How to achieve this using post_install hook in Podfile?Palazzo
J
22

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

Jaredjarek answered 30/8, 2017 at 11:47 Comment(1)
You save my day, the problem was that I have custom configs so Cocoapods was not finding the config "Debug"Viridian
N
20

Make sure that you properly set your checkboxes under your app scheme. You SHOULD UNCHECK your test targets for Archive Build.

enter image description here

Noninterference answered 11/8, 2016 at 13:31 Comment(2)
For more information look here: developer.apple.com/library/mac/technotes/tn2215/_index.htmlCold
If you have separate targets please make sure that both of them have the same schemes. For example, Dev, Prod etc.Update
I
12

For those of you who are experiencing this only upon running Xcode Profiler: switch profile build configuration in your scheme management to the one that has testability enabled - and that would be debug in most cases:

enter image description here

Insignificant answered 15/8, 2017 at 17:1 Comment(2)
This was the answer for me. The Test portion of the scheme was using the wrong build configuration.Roaster
If you have separate targets please make sure that both of them have the same schemes. For example, Dev, Prod etc.Update
B
12

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.

Brabant answered 26/9, 2019 at 8:51 Comment(0)
S
8

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

Salzman answered 1/8, 2017 at 12:15 Comment(1)
How can I avoid importing frameworks using @testable? What's the good practice here?Healy
B
2

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
Bora answered 15/10, 2019 at 11:46 Comment(1)
For a release build of the app, would one need to then do another clean install without the "ENABLE_TESTABILITY"? As development continues, would one repeatedly install with and without this build setting on the cocoapods projects to allow use of UITests?Roofdeck
L
2

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):

  1. Select the main target of your project
  2. Go to the "Build Settings" tab
  3. Turn on the "All" option
  4. Search for the "Build Options" section
  5. Set "Enable Testability" to "Yes"
  6. Wait for a few minutes or restart Xcode (then the error disappeared)
Lithic answered 25/1, 2022 at 2:40 Comment(0)
F
1

I got this when my new Tests.swift file belonged to the wrong Target.

Forewent answered 28/1, 2022 at 16:15 Comment(0)
K
0

Above solution is fine if you are using pods/Carthage. But if you are using frameworks from iOS itself 'e.g. Contacts', you need add path to these frameworks in 'Library Search Paths' of your main project's target. enter image description here

Kraigkrait answered 9/11, 2017 at 7:2 Comment(0)
P
0

If you trying to test framework:

Go to test target -> Build Phase -> Create new copy files phase -> Choose frameworks -> Add all recursively used frameworks

Pecksniffian answered 15/10, 2018 at 12:30 Comment(0)
G
-5

This didn't occur in my projects prior to Xcode 8, but after I upgraded to Xcode 8, it made me perplexed.

The answers posted here didn't get my problems resolved. For me, I just ditched these tests as it is not needed. So uncheck the test buttons:

enter image description here And now the error has gone out.

Geoid answered 13/10, 2016 at 19:5 Comment(1)
If you don't need the tests, it might be better to remove the test targets from your project instead of removing them from all the builds.Healy

© 2022 - 2024 — McMap. All rights reserved.