"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.