Xcode Unit Testing con Cocoapods


119

Ho sbattuto la testa contro un muro con questo negli ultimi giorni, ma nonostante le molteplici ricerche su Google / SO / Github non riesco a trovare una soluzione ai problemi che sto avendo!

Tutto quello che sto cercando di fare è creare alcuni unit test per la mia app che utilizza i pod Firebase.

Sto usando Xcode 7.3.1 e Cocoapods 1.0.1. Aggiornamento: il problema persiste con Xcode 8.0

Con questo podfile:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

target 'MyApp' do
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target 'MyAppTests' do
        inherit! :search_paths
    end
end

Nella mia classe XCTest ottengo

Modulo richiesto "Firebase" mancante

errore in @testable import MyApp

In alternativa con questo podfile:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

def common_pods
    pod 'SwiftyTimer'
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'
end

target 'MyApp' do
    common_pods
end

target 'MyAppTests' do
    common_pods
end

I test vengono compilati ma la mia console è piena di avvisi, ad esempio:

La classe <-FirebaseClassName-> è implementata sia in ... MyApp ... che ... MyAppTests ... Verrà utilizzato uno dei due. Quale è indefinito


Stavo usando solo Firebase Analytics. Dopo il passaggio a Google Analytics, tutto funziona a meraviglia.
marosoaie

Non l'ho ancora provato da solo, ma potrei tentare di includere Firebase manualmente senza utilizzare i pod di cacao: firebase.google.com/docs/ios/setup#frameworks
Jonny

1
Questo è ancora un problema
Edward

Risposte:


84

Ho avuto lo stesso problema. L'ho risolto passando pod 'Firebase'al mio obiettivo di prova. Cambia il tuo Podfile in questo:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

target 'MyApp' do
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target 'MyAppTests' do
        inherit! :search_paths
        pod 'Firebase'
    end
end

Grazie, ma ho appena provato e ho ancora il problema "Classe ... è implementato in entrambi ...".
doover

1
Ha funzionato per me ma ancora non ha senso per me. Non è la prima volta che posso dire che Firebase sta configurando i propri podspec in modo strano, cfr. twitter.com/dirtyhenry/status/836240557311684608 ma il team di Firebase non risponde :(
Dirty Henry

4
Apportare questa modifica non ha cancellato immediatamente l'avviso, ma è stato risolto dopo aver eseguito pod install.
blwinters

Mezzo problema risolto. e l'altra metà viene risolta aggiungendo "$ {PODS_ROOT} / Firebase / Core / Sources" al target dei test solo in Impostazioni build -> Percorsi di ricerca intestazione
ArgaPK

Dopo aver pod install
apportato

57

Prova a cambiare l'eredità in :complete, come in:

target 'MyAppTests' do
    inherit! :complete
end

È importante sottolineare che consente a chiunque altro di controllare il tuo repository di fare semplicemente un pod updatecome al solito senza dover copiare .xcconfigfile o altri hacker solo per costruire.


1
Questo ha anche il numero "Classe ... è implementato in entrambi ..."
Diogo T

Ha fatto scomparire l'errore in fase di compilazione, ma ha causato questo in fase di esecuzione: clang: errore: comando linker non riuscito con codice di uscita 1 (utilizzare -v per vedere l'invocazione)
CMont

Ha funzionato anche per me! Grazie :)
smapps

52
  1. Seleziona l'impostazione Target di test unitario.
  2. Vai a Impostazioni build.
  3. Cerca percorsi di ricerca intestazione.
  4. Aggiungi questo valore $ (SRCROOT) / Pods con ricorsivo, quindi Xcode risolverà il percorso per te.

Esempio


1
Grazie @Kanika Sharma
Rahul K Rajan

34

Il problema è che Firebase fa qualcosa di speciale con i percorsi di ricerca dell'intestazione dopo che CocoaPods ha generato il proprio valore per l'impostazione in modo che CocoaPods non rilevi questa modifica per trasferirla all'obiettivo di prova. Puoi risolvere questo in due modi:

  1. Individua MyAppTests.<configuration>.xcconfignel navigatore di file e aggiungi quanto segue a HEADER_SEARCH_PATHS:

    ${PODS_ROOT}/Firebase/Analytics/Sources [*]

  2. Trova l'impostazione per Percorsi di ricerca intestazione in Impostazioni build e aggiungi lo stesso valore dell'opzione 1 all'elenco. Non dovresti aver bisogno di impostarlo come ricorsivo.

* Secondo il commento di AKM, questo è cambiato ${PODS_ROOT}/Firebase/Core/Sourcesnella versione 3.14.0


Ho

8
A partire da Firebase 3.14.0 Questa soluzione è valida, tuttavia la patch è stata modificata in${PODS_ROOT}/Firebase/Core/Sources
AKM

1
Il nuovo percorso ha funzionato anche per me! Sto eseguendo CocoaPods versione 1.2.0 , ma tieni presente che ho anche dovuto aggiungere inherit! :search_pathsall'obiettivo di test nel file Podfile.
Paulo Mattos

2. non funziona per me. Utilizzando Firebase 3.x (non il più recente 4.x)
Jonny

Il problema può essere seguito qui: github.com/firebase/firebase-ios-sdk/issues/58
CMont

7

Tre passaggi prima che potessi farlo funzionare:

CocoaPods: 1.5.0 Swift 4 Firebase: 4.13.0

Passaggio 1: assicurati di aggiungere il seguente blocco di destinazione nel tuo podfile.

# Uncomment the next line to define a global platform for your project
platform :ios, '11.3'

target 'TIMII' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!

# Pods for TIMII
pod 'Firebase/Core'
pod 'Firebase/Database'
pod 'Firebase/Auth'
pod 'Firebase/Storage'

    target 'TIMIITests' do
        inherit! :search_paths
        pod 'Firebase/Core'
    end

end

Passaggio 2: all'interno della scheda Impostazioni build del Navigatore progetto YourAppTests. Trova la riga del percorso di ricerca dell'intestazione e aggiungi a Debug la riga seguente

$ (ereditato) $ {PODS_ROOT} / Firebase / Core / Sources

Passaggio 3: nell'esecuzione del terminale:

aggiornamento pod


7

Il problema è registrato nel progetto Firebase qui:

https://github.com/firebase/firebase-ios-sdk/issues/58

C'è una soluzione alternativa:

Aggiungi "$ {PODS_ROOT} / Firebase / Core / Sources" al target dei test solo in Impostazioni build -> Percorsi di ricerca intestazione

ma questo viene risolto anche aggiornando a CocoaPods 1.4.0 o successivo, che è una soluzione migliore.

Nel momento in cui scrivo questo (novembre 2017) cocoapods 1.4.0 è ancora in beta, quindi per installarlo è necessario richiedere esplicitamente la beta:

gem install cocoapods --pre

Questo e poi facendo un pod installrisolto il problema eseguendo i miei test.


1
cos'è "PODS_ROOT" ??
ArgaPK

@ArgaPK È una variabile che cocoapods imposta. Basta incollare esattamente quello che ho scritto tra le "" s in Xcode. Il modo migliore è davvero aggiornare i tuoi CocoaPods a> = 1.4.0.
JosephH

1
@ JosephH che aggiorna i miei cocoapods alla 1.5.2 non ha risolto il problema, purtroppo.
Stacy Smith

@AnastasiaKovaleva hai eseguito pod installdopo l'aggiornamento?
JosephH

@JosephH Running ha pod installrisolto il mio problema! Molte grazie!
Stacy Smith,

4

La soluzione per me era aggiornare cocoapods alla versione 1.1.0.rc.2.

sudo gem install cocoapods --pre


Purtroppo per me non funziona ... devo riprendere il mio voto positivo!
Zeb

Scusa se non ti ha aiutato ragazzi, non sono sicuro del motivo per cui ha risolto il problema per me e non per te ...
doovers

Sono su 1.20 e senza fortuna
UKDataGeek

4

Ho provato tutto quanto sopra e mi sono imbattuto in vari errori diversi, originariamente a partire da Missing required module 'Firebase', quindi ottenendo "Class ... is implemented in both ... "o problemi di linker se ho provato ad aggiungere Firebase Pod al mio obiettivo di test.

La soluzione che ha funzionato per me è stata:

  1. Rimuovi completamente il target di test da Podfile ed esegui "pod update" per assicurarti che il progetto XCode sia sincronizzato.
  2. Apri le impostazioni di costruzione del mio target di test e aggiorna i percorsi di ricerca dell'intestazione per includere solo i seguenti 3 elementi:
    • $(inherited) non-recursive
    • $(SRCROOT)/Pods/Headers/Public recursive
    • $(SRCROOT)/Pods/Firebase recursive

A questo punto, pulire la cartella di build, ricostruire e rieseguire i test ha funzionato per me. Spero che questo aiuti qualcuno!


Dopo aver provato tutto il resto su questo thread, questa è stata l'unica risposta che ha funzionato per me. Grazie!
Ali Parr

4

L'aggiunta ${SRCROOT}/Pods/Firebase/CoreOnly/Sourcesdei "Percorsi di ricerca dell'intestazione" del target di unit test ha risolto il problema. passi:

  1. Seleziona il tuo obiettivo di unit test
  2. Vai a Impostazioni build
  3. Cerca il percorso di ricerca dell'intestazione
  4. Aggiungi $ {SRCROOT} / Pods / Firebase / CoreOnly / Sources

inserisci qui la descrizione dell'immagine

Dopo questo i test possono essere eseguiti e l'errore scompare.


2

Ho avuto un problema simile. Formulato in base alla tua domanda, ho copiato il contenuto del mio MyApp.<configuration>.xcconfigfile nel mio MyAppTests.<configuration>.xcconfigfile. Ho pulito e costruito i test e ha funzionato.


Questa era l'unica soluzione che ha funzionato per me. Grazie! Sto pensando di eseguire un'elaborazione post installazione nel Podfile facendo questo
SauloT


1

Come menzionato da @Will, un problema relativo ai percorsi di ricerca delle intestazioni dopo l'installazione di CocoaPods.

Ho un progetto con più obiettivi in ​​cui il pod "Firebase" è incorporato in un modulo separato, diciamo MyProject-Shared. Pod Firebase in "Podfile" installato solo per la destinazione "MyProject-Shared". Altri moduli che desiderano utilizzare "MyProject-Shared" non possono essere compilati a causa di un errore:

"modulo obbligatorio mancante" Firebase ""

Il trucco nel mio caso era aggiungere il seguente percorso di ricerca dell'intestazione mancante nelle impostazioni di compilazione di ciascun target che fa riferimento ad Analytics-Framework :

"${PODS_ROOT}/Firebase/CoreOnly/Sources"

Si prega di vedere la foto sotto: Percorso di ricerca dell'intestazione

Spero che ti farà risparmiare tempo.


1

Un metodo più semplice che funziona anche:

target 'MyApp' do
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target :MyAppTests
end

0

Missing required module Firebase NESSUNA soluzione CocoaPods

Per coloro che riscontrano lo stesso problema ma NON utilizzano CocoaPods:

Se stai usando Firebase, allora hai qualche cartella contenente Firebase.he module.modulemapfile. Per esempio -YOUR_PROJECT_DIR/Linking

Se l'obiettivo del tuo progetto principale funziona correttamente, dovresti andare su ProjectSettings -> Target. Seleziona target di test. Cerca User headerse aggiungi il percorso a YOUR_PROJECT_DIR/Linking. Seleziona l' recursiveopzione e dovresti essere a posto.

Guarda lo screenshot per maggiori dettagli:

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.