"Nessun modulo di questo tipo" quando si utilizza @testable nei test dell'unità Xcode


168

Di recente ho aggiornato a Xcode 7 beta 5. Ho provato ad aggiungere un unit test a un progetto precedente, ma sto ricevendo il messaggio di errore "No such module [myModuleName]" sulla @testable import myModuleNamelinea.

inserisci qui la descrizione dell'immagine

Provai

  • pulizia del progetto con OptionClean Build Folder
  • verificando che "Abilita testabilità" (debug) fosse impostato su Sì nelle Opzioni di creazione
  • eliminando il target dei test e quindi aggiungendo nuovamente il bundle di test dell'unità iOS

Niente di tutto ciò ha funzionato per questo progetto (ma ho ottenuto dei test per lavorare in un altro progetto). Qualcun altro ha avuto questo problema e lo ha risolto?



Se stai compilando dalla riga di comando con xcodebuild assicurati di aggiungere il flag -workspace per il tuo comando build. Ho risolto questo problema sul mio travis build in quel modo.
Victor "Chris" Cabral,

Risposte:


210

Controlla il nome del modulo con cui provi a importare @testable import "ModuleName". Il nome del modulo dovrebbe essere lo stesso suTarget->Build Settings-> Product Module Name


5
Nella maggior parte dei casi, si tratta del nome del modulo del prodotto. Controlla spacee_
onmyway133

5
stai attento a -e _. Uno dei miei progetti ha meno -nel nome, ma il modulo ha _invece un trattino basso
berillio

4
ho usato l' ""idea e ho avutoExpected identifier in import declaration
circa il

1
@ onmyway133 era molto vicino. Nel mio caso, avevo un nome del modulo prodotto diverso dal nome del mio progetto. Per trovare il nome del tuo modulo vai a Build Settingsselezionare il tuo progetto (non il test o il test dell'interfaccia utente), quindi cerca PRODUCT_MODULE_NAMEqualsiasi cosa si presenti lì è ciò che dovrebbe andare dopo@testable import
jonmecer

115

La risposta che ha funzionato per me

La risposta è stata che ho avuto alcuni errori nel mio progetto che stavano facendo fallire la compilazione. (Era solo il tuo bug quotidiano nel codice.) Dopo aver corretto gli errori e fatto un altro clean and build, ha funzionato.

Si noti che questi errori non si sono manifestati inizialmente. Per farli apparire:

  • Commenta l'intero file di test che ti dà l'errore "Nessun modulo di questo tipo".
  • Prova a eseguire nuovamente il tuo progetto.

Se ci sono altri errori, dovrebbero comparire ora. Risolvili e decommenta il codice del file di test. L'errore "Nessun modulo del genere" era scomparso per me.


Nel caso in cui ciò non risolva il problema per altre persone, puoi anche provare quanto segue:

Pulisci la cartella di generazione

Apri il menu Prodotto, tieni premuto Optione fai clic su "Pulisci cartella build ..."

inserisci qui la descrizione dell'immagine

Assicurarsi che Abilita testabilità sia impostato su Sì

Nel Navigatore progetto fai clic sul nome del tuo progetto. Seleziona Impostazioni di costruzione e scorri verso il basso fino a Opzioni di costruzione. Assicurarsi che Abilita testabilità sia Sì (per il debug).

inserisci qui la descrizione dell'immagine

Elimina e aggiungi nuovamente il target dei test

Se hai fatto le altre cose, la mia ipotesi è che probabilmente non è necessario farlo. Ma se lo fai, ricordati di salvare qualsiasi Test di unità che hai già scritto.

Fai clic sul nome del tuo progetto in Project Navigator. Quindi selezionare il target dei test. Fai clic sul pulsante meno (-) in basso per eliminarlo.

inserisci qui la descrizione dell'immagine

Quindi fai clic sul pulsante più (+) e scegli il pacchetto Test unit unit iOS per aggiungerlo nuovamente. Come puoi vedere, puoi anche aggiungere un pacchetto di test dell'interfaccia utente allo stesso modo.

Alcune altre idee

  • Assicurarsi che tutte le classi richieste siano membri del target del test.
  • Assicurati di aver aggiunto tutte le librerie richieste.
  • Assicurarsi che il nome del modulo sia scritto correttamente (vedere questa risposta ).

O...

Lascia un commento o una risposta qui sotto se hai trovato qualcos'altro che ha funzionato.

Relazionato


2
Avendo tutti gli stessi problemi qui, con Xcode 7 beta 5. Sfortunatamente i passaggi sopra non sembrano risolverlo - il modulo sta ancora considerando "nessuna di queste utilità". L'unica differenza dai tuoi screenshot è che sto cercando di farlo funzionare con la cartella dei test dell'interfaccia utente (GlimpulseUITests nel mio caso). @Testable non funziona forse con il target del test dell'interfaccia utente?
Zac,

5
*** IMPORTANTE *** Se si elimina e si aggiunge nuovamente il target di test, verrà ricreato un modello di test vuoto sovrascrivendo i test esistenti. Assicurati di salvare le tue fonti di test prima di farlo.
Paul

2
Per me anche le mie singole classi non venivano mostrate durante la digitazione ... Alla fine ho fatto Prodotto> Pulito, riavviato XCode. Quando è stato riavviato, gli è stato concesso qualche secondo per completare l'indicizzazione, quindi voilà sono stati mostrati tutti i miei riferimenti senza dover includere ogni classe come membro del target del test.
Rajive Jain,

1
Inoltre, se non l'hai ancora provato, fai clic sul framework mancante a sinistra, quindi a destra seleziona "Abbonamento target" e includilo nell'obiettivo del test unitario.
albogdano,

3
Vai a creare le impostazioni del tuo obiettivo principale -> "Nome modulo prodotto" e vedi se corrisponde al nome del modulo che tenti di importare nel test.
f0rz,

64

Il problema per me era che il target di distribuzione iOS dei test non era impostato per essere il target principale. Quindi assicurati di controllare questo.

Nel target del test:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>

Dopo aver fatto questo, ho dovuto impostare Enable Bitcodeper Noil Bundle di prova.
Pableiros,

2
Lol funziona ma quanto è stupido da xcode che non genera un errore diverso
J. Doe,

31

Quindi è così che sono riuscito a far funzionare il mio codice dopo aver provato tutte le soluzioni suggerite da suggerimenti precedenti.

  • Ho impostato "Abilita testabilità" su "SÌ" nelle Impostazioni di costruzione del progetto
  • Ho anche impostato "Definisci modulo" su "SÌ" nelle Impostazioni di costruzione del mio progetto.
  • Per i normali file .swift all'interno del mio progetto, ad esempio MyApp , stavo per scrivere casi di test, ho sia i target " MyApp " principali sia i target " MyAppUnitTests " controllati in Target Membership .
  • Ho quindi selezionato i miei file di test unitari, ho dichiarato " @testable import MyApp " in alto, sotto " import XCTest " e ho verificato solo "MyAppUnitTests" in Target membership

E tutto ha funzionato come un fascino. Spero che questo ti aiuti.


8
Abilita testabilità e definisce il modulo è ciò che ha fatto il trucco. Non ho avuto bisogno di cambiare le iscrizioni di destinazione per i normali file * .swift.
George Yacoub,

Ho fatto tutti i passaggi precedenti ma non ho ancora questo errore del modulo. il mio progetto è un mix rapido e oggettivo
Mikael

@Mikael, stai scrivendo test solo per i file Swift nella tua base di codice di miscela Objc / Swift? (Chiedo perché, l'ultima volta che ho verificato, penso che '@testable import' abbia funzionato solo per la scrittura di casi di test solo per i file Swift anche nella combinazione di codebase Obj-c / Swift. Probabilmente potrebbe essere cambiato ormai. Qualcuno mi corregga se sbaglio qui).
Vick Swift

6
Ho trovato il mio problema È stato perché l'architettura valida del mio obiettivo Test non era la stessa configurazione dell'architettura valida del mio obiettivo principale. Ora funziona. A proposito, sto testando solo le classi Swift nel mio caso, non ci ho provato per Obj-c
Mikael

3
Non dovresti aggiungere i file rapidi dell'applicazione alla destinazione del test, perché il loro contenuto verrà duplicato durante l'esecuzione dei test.
Przemysław Wrzesiński,

18

Un aspetto da tenere presente è che se il nome del tuo modulo ha un trattino al suo interno, -dovrai invece fare riferimento ad esso con una barra _. Per qualche ragione sospettavo che questo potesse essere un problema ed era davvero il mio problema.

per esempio. @testable import Ocean-Swiftdiventa@testable import Ocean_Swift

Solo un'altra cosa, se si utilizza la @testablesintassi assicurarsi di non includere il codice di produzione nel target di test. Ho scoperto che questo causerà stranezze inspiegabili.


1
potrebbe essere necessario sostituire anche tutti i caratteri non alfanumerici con il trattino basso. Il mio obiettivo era in questo formato App (Dev), Il modulo testabile è diventatoApp__Dev_
fungo

11

Questo sembra essere un errore con le impostazioni di costruzione di entrambi i target. Devi assicurarti che:

  • ENABLE_TESTABILITY è uguale a Sì per entrambi i target.
  • Il PRODUCT_MODULE_NAMEvalore dell'obiettivo del test dovrebbe differire da quello dell'applicazione.

2
Questo ha funzionato per me. Stavo usando il nome del modulo sbagliato. Stavo rimuovendo lo spazio invece di aggiungere un _. CONTROLLA DOPPIO I NOMI DEI MODULI DI PRODOTTO NELLE IMPOSTAZIONI DELLA
COSTRUZIONE

9

Un'altra cosa da verificare: se si dispone di un progetto Objective-C, ma si stanno scrivendo test unitari in Swift, assicurarsi che l'obiettivo principale utilizzi almeno un file Swift!


Ulteriori informazioni:

Stavo lavorando a un progetto Objective-C, ma volevo scrivere unit test in Swift.

Ho aggiunto un file Swift all'obiettivo principale per generare il file ProjectName-Bridging-Header.h necessario, ho scritto i miei test e tutto funzionava correttamente.

Successivamente ho eliminato il file Swift perché pensavo di non averne bisogno (tutto il codice del target principale è in Objective-C ... Stavo solo scrivendo test in Swift).

Non ho notato alcun problema fino a dopo, dopo aver creato una "cartella di build pulita / pulita" e il problema "No Such Module" è apparso. Dopo qualche graffio alla testa ho aggiunto un nuovo file Swift vuoto e il problema è scomparso.

L'ho provato più volte con / senza il file Swift, e funziona solo con esso ... quindi, dovrò lasciare il file vuoto nel progetto, convertire un Objective-C in Swift o aggiungerne un po ' nuovo codice per il progetto scritto in Swift.


1
!! dopo 3 ore di pulizia, eliminazione dei dati recuperati, pulizia, a partire da zero 3 volte, ho trovato il tuo commento che ha risolto il mio problema !!! Grazie !!!!
Maryam Fekri,

Sai come accedere alle classi Objective-C nelle classi di test Swift, perché importare il modulo di progetto e non c'è alcun errore in questo, ma non riconosce ancora le mie classi Objective-C. dovrei fare un'altra cosa?
Maryam Fekri,

Un ulteriore punto che vorrei aggiungere, anche se il mio progetto principalmente ObjC ha almeno un file Swift, non c'era intestazione ponte per il mio obiettivo. Seguendo le istruzioni al seguente link sotto l'intestazione "Importa codice all'interno di un target app" è stato risolto il problema di poter accedere alle classi ObjC dai test Swift. developer.apple.com/documentation/swift/…
palmi

Ho riscontrato questo problema. Comunque, io sono interessato a trovare un modo per evitare di includere il file di Swift, se possibile, così ho fatto la domanda qui: stackoverflow.com/q/62965954/211292
ThomasW

In realtà, sembra che se non includi la @testable import Foolinea, i test delle unità dovrebbero essere eseguiti correttamente.
ThomasW

9

Per coloro che hanno fatto scorrere fino all'ultima risposta e ancora niente ha funzionato, ecco cosa mi ha fatto dopo aver seguito tutti gli altri consigli sulle risposte. Sto usando Xcode 11:

Ciò che ha causato il problema nel mio caso è che ho cambiato il mio nome prodotto

  1. Ho cambiato il mio nome prodotto nelle impostazioni di costruzione del mio obiettivo principale in "Nuovo nome"
  2. Ho dovuto riselezionare l' applicazione host per il mio obiettivo di prova
  3. Non sapevo che la modifica del nome del prodotto avrebbe cambiato anche il Nome del modulo del prodotto , ovvero quello utilizzato per l'importazione del modulo nei miei file di test. Ho modificato la mia importazione come segue:

    @testable import New_Name

  4. Ha funzionato

spero possa essere d'aiuto


7

Dopo aver trascorso un paio di giorni su questi problemi, finalmente riesco a lavorare con il mio progetto. Il problema era nell'intestazione ponte - il percorso nell'obiettivo Test non può essere vuoto se si utilizza l'intestazione ponte nell'obiettivo principaleBridging Header non può essere vuoto !!!

Spero che risparmi un po 'di tempo per qualcuno.


5

Assicurarsi sotto l'impostazione di build dello schema di test, la destinazione del test è nell'elenco.

Accanto al pulsante di riproduzione, seleziona lo schema di test, quindi Modifica schema ..., vai alla sezione Build, fai clic su più + e seleziona l'obiettivo su cui vuoi testare.

Nel mio caso, abbiamo un obiettivo interno con cui sviluppiamo (alcune differenze minori) e dopo un'unione, è stato rimosso dalla configurazione di test.

Modifica schema di test


5

Ecco un'altra cosa da verificare che non è elencata. Per me, aveva qualcosa a che fare con il mio team, forse perché l'agente del nostro team non aveva ancora accettato l'ultimo accordo di licenza! Una volta selezionato un team diverso nelle impostazioni generali del mio target, quindi ho specificato un target di distribuzione specifico come 12.1 o 11.0, improvvisamente l'avviso "Nessun modulo di questo tipo" è scomparso.

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


4

Nel mio caso, ho avuto 3 problemi. Il primo è stato che dovevo specificare il percorso di importazione in:

Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths

Il secondo era che stavo usando Pod e ho dovuto importare questi pod anche nei miei test usando:

target 'MyAppTests' do
    inherit! :complete
end

Il terzo come quello che stavo usando un'intestazione ponte nel mio obiettivo, quindi ho dovuto specificare l'intestazione ponte per essere la stessa per il test.


2

Il mio problema era che la classe che volevo testare doveva essere in un modulo separato (client API), ma la classe era in realtà un membro del target dell'app e non il target del framework. La modifica dell'appartenenza di destinazione della classe ha fatto scomparire l'errore di importazione!


2

Ambiente: Xcode versione 9.0 (9A235)
Scenario: test di un framework open source.

Ho avuto lo stesso problema: "Nessun modulo del genere".

Soluzione:

  1. Seleziona il target del test.
  2. Seleziona Crea fasi
  3. Aggiungi il framework da testare tramite Link Binary ...

inserisci qui la descrizione dell'immagine

Ecco il file di prova: inserisci qui la descrizione dell'immagine


2

Ho avuto lo stesso problema. La pulizia della cartella di build e il riavvio di Xcode non ha funzionato.

Ciò che ha funzionato per me è stato garantire che l'impostazione per "Costruisci solo architettura attiva" del target e dello schema del test corrispondesse all'impostazione del target e dello schema dell'app.


2

Ho seguito i passaggi sopra, che ha funzionato. Tuttavia, il mio progetto ha avuto qualche problema in più. Ho ricevuto questo avviso e non sono stato in grado di accedere alle classi dal mio progetto principale per testare nel mio obiettivo di test.

Verifica parte del modulo - ignorando l'importazione

Ho scoperto che il nome del modulo del prodotto target del test (YourTestTarget -> Impostazioni build -> cerca product module) non può avere lo stesso nome del nome del progetto.

Il nome del modulo del prodotto per la destinazione del test non può avere lo stesso nome del nome del progetto

Una volta modificato il nome del modulo del prodotto per il mio obiettivo di test, tutto ha funzionato.

inserisci qui la descrizione dell'immagine


1

Ho provato tutte le risposte qui, ma la bandiera rossa non sarebbe andata via. Ma l'ho fatto funzionare semplicemente "eseguendo" un test vuoto a prescindere e si è risolto.

Le cose che vorrei assicurarsi sono state fatte:

  • Applicazione host
  • @testable import "Module_name" (assicurarsi che il nome del modulo sia corretto)
  • Assicurarsi che la destinazione di distribuzione per il test sia la stessa del progetto
  • XCTest non deve essere abbonato a Target

0

Per me la soluzione è stata quella di rinominare @testable import myproject_ios in @testable import myproject dopo aver aggiornato il nome del prodotto di target myproject-ios in Impostazioni build / Packaging / Nome prodotto / da $ {TARGET_NAME} a myproject.


0

Questo è stato risolto per me quando ho cambiato il Deployment Target da 9.3 a 11.0.

Generale> Target di distribuzione> "11.0"


questo potrebbe essere più il caso di cambiare i simulatori ma questo ha funzionato anche per me
RolandasR

0

La mia soluzione è qui

In primo luogo fare clic su OdeAlSwiftUITest.swift, quindi selezionare Project TargetName nell'abbonamento target.

inserisci qui la descrizione dell'immagine


8
Questo è sbagliato. Non aggiungere mai i file di test al target.
smileBot,

0

Se stai usando xcodebuild e riscontri questo problema, considera di aggiungere un comando di area di lavoro al comando build.

Modificato questo

$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test

A questa

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test

0

Nel target del test delle impostazioni di build, controlla il test host, prende il nome impostato in PRODUCT_NAME. È quel nome che dovresti usare nelle classi di test.

Consiglio di non modificare PRODUCT_NAME (nome della corrispondenza del target principale)


0

inserisci qui la descrizione dell'immagine

Fai clic su MyAppTests.swift nel navigatore del progetto e fai clic sul pannello a destra, controlla il modulo nell'abbonamento di destinazione. Funziona nel mio.


Non è necessario aggiungere classi di test alla destinazione dell'applicazione.
Alex Motor


-1

Come descritto in questa risposta, stavo aggiungendo i test Swift a un progetto solo Obj-C. La soluzione era quella di aggiungere una classe Swift fittizia, dopo di che Xcode avrebbe richiesto di aggiungere un'intestazione ponte, quindi rimuovere la classe Swift. Dopo tutto è andato bene.


-1

Oltre alle altre cose elencate, ho dovuto aggiungere il file con la classe che stavo provando a testare nelle mie fonti di compilazione per il modulo unit testinserisci qui la descrizione dell'immagine


-1

Penso che ciò possa essere accaduto perché ho eliminato i test di esempio.

Ho rimosso il pacchetto di test unitari, quindi l'ho aggiunto di nuovo come mostrato nelle immagini sottostanti e tutto è andato di nuovo bene.

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

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.