"Il modulo non è stato compilato per il test" quando si utilizza @testable


146

Sto cercando di utilizzare la nuova @testabledichiarazione di Swift 2 per esporre le mie lezioni all'obiettivo del test. Tuttavia sto ricevendo questo errore del compilatore:

inserisci qui la descrizione dell'immagine

Intervalsè il modulo che contiene le classi che sto cercando di esporre. Come posso eliminare questo errore?

Risposte:


239

Nel tuo obiettivo principale devi impostare l' Enable Testabilityopzione di costruzione su Sì.

Secondo il commento di @earnshavian di seguito, questo dovrebbe essere usato solo su build di debug secondo le note di rilascio di Apple: "L'impostazione Abilita build di testabilità dovrebbe essere usata solo nella tua configurazione di Debug, perché proibisce ottimizzazioni che dipendono dal non esportare simboli interni da l'app o il framework " https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326


Ciao, ricevo lo stesso errore ma non vedo l'opzione di testabilità abilitata e sto usando xcode 7. Qualche idea su cosa dovrei fare?
user1601259

2
@ user1601259 - Puoi trovare l'opzione selezionando il progetto di livello superiore, andando su Impostazioni di costruzione e guardando sotto l'intestazione Opzioni di costruzione.
hgwhittle,

@hgwhittle - Quando seleziono il progetto di livello superiore, tutto ciò che vedo nelle opzioni di compilazione è "formato informazioni debug" e "convalida prodotto build". Quando seleziono la destinazione nelle opzioni di creazione, vedo "il contenuto incorporato contiene codice rapido". Questo è tutto. Quando cerco nelle impostazioni di compilazione non riesco a trovarlo. È a causa di xcode 7?
user1601259

1
È possibile che tu abbia selezionato "Base" in "Impostazioni build". Se selezioni "Tutto" sul lato sinistro, vedrai "Abilita testabilità"
Array

1
Come dovrebbe funzionare esattamente per le build di rilascio, dove verranno eseguiti i test (quindi necessità @testable) ma devono essere inviati all'App Store? Se Enable Testabilityè solo per build di debug, qual è il modo per aggirare questo? Devo estrarre il mio codice di prova per il rilascio?
Timgcarlson,

15

Nel mio caso ho usato una configurazione di build personalizzata per i test (chiamata Test) e anche cocoapodscome gestore delle dipendenze

Ho dovuto aggiungere le seguenti righe alla fine del mio Podfileper abilitare la testabilità

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

Con predefinite cocoapodsset ENABLE_TESTABILITYper YESsolo per Debugbuild



8

Per quelli di voi che lo sperimentano solo quando si esegue Xcode Profiler: passare la configurazione di compilazione del profilo nella gestione dello schema a quella che ha abilitato la testabilità - e che sarebbe debug nella maggior parte dei casi:

inserisci qui la descrizione dell'immagine


4

Questo probabilmente perché il tuo obiettivo principale Enable Testabilityè impostato su NO. È necessario impostarlo su YESnello schema di debug (utilizzato per l'esecuzione dei test).

Se si utilizza Cartagine, questo problema può essere causato dall'importazione di framework con @testable, poiché sono creati con uno schema di rilascio.

La maggior parte delle volte è una cattiva pratica importare framework con quel prefisso, quindi è possibile evitarlo. Se non è possibile, è necessario Enable Testabilitynello schema di rilascio dei framework. https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326


2
Come posso evitare di importare framework usando @testable? Qual è la buona pratica qui?
Jonathan Cabrera,

3

Ho iniziato a ricevere questo errore durante l'esecuzione dei test con Bitrise.

A differenza di altri utenti, questo non è per Targetbase o per Schemabase, è per Configurationbase. Seleziona Target-> Build Settingsscheda -> cerca testability-> Abilitalo sulla Configurazione che stai utilizzando .

Si noti che Apple consiglia di abilitarlo sulla configurazione che si sta utilizzando per il debug, non per AppStore.


0

La soluzione sopra va bene se stai usando baccelli / Cartagine. Ma se si utilizzano framework da iOS stesso "ad es. Contatti", è necessario aggiungere un percorso a questi framework in "Percorsi di ricerca nella libreria" della destinazione del progetto principale. inserisci qui la descrizione dell'immagine


0

Se stai provando a testare il framework:

Vai alla destinazione del test -> Fase di costruzione -> Crea nuova fase di copia dei file -> Scegli quadri -> Aggiungi tutti i quadri usati ricorsivamente


0

Se per caso hai

install! 'cocoapods',
         generate_multiple_pod_projects: true,
         incremental_installation: true

Quindi, questo è il modo di farlo.

    # 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

-3

Questo non si è verificato nei miei progetti prima di Xcode 8, ma dopo l'aggiornamento a Xcode 8, mi ha lasciato perplesso.

Le risposte pubblicate qui non hanno risolto i miei problemi. Per me, ho appena abbandonato questi test in quanto non è necessario. Quindi deseleziona i pulsanti di prova:

inserisci qui la descrizione dell'immagine E ora l'errore è scomparso.


1
Se non hai bisogno dei test, potrebbe essere meglio rimuovere gli obiettivi del test dal tuo progetto invece di rimuoverli da tutte le build.
Jonathan Cabrera,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.