Xcode Unit Testing mit Cocoapods


119

Ich habe in den letzten Tagen meinen Kopf damit gegen eine Wand geschlagen, aber trotz mehrfacher Google / SO / Github-Suchen kann ich keine Lösung für die Probleme finden, die ich habe!

Ich versuche nur, einige Komponententests für meine App zu erstellen, bei denen Firebase-Pods verwendet werden.

Ich verwende Xcode 7.3.1 & Cocoapods 1.0.1. Update: Das Problem bleibt bei Xcode 8.0

Mit dieser Poddatei:

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

In meiner XCTest-Klasse bekomme ich

Fehlendes erforderliches Modul 'Firebase'

Fehler bei @testable import MyApp

Alternativ mit dieser Poddatei:

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

Die Tests werden erstellt, aber meine Konsole ist mit Warnungen übersät, z.

Die Klasse <-FirebaseClassName-> ist in beiden ... MyApp ... und ... MyAppTests ... implementiert. Eine der beiden wird verwendet. Welches ist undefiniert


Ich habe nur Firebase Analytics verwendet. Nach dem Wechsel zu Google Analytics funktioniert alles wie ein Zauber.
Marosoaie

Ich habe es selbst noch nicht versucht, aber ich könnte versuchen, Firebase manuell einzuschließen, ohne Kakaofrüchte zu verwenden: firebase.google.com/docs/ios/setup#frameworks
Jonny

1
Dies ist immer noch ein Problem
Edward

Antworten:


84

Ich hatte das gleiche Problem. Ich habe es gelöst, indem ich pod 'Firebase'mich zu meinem Testziel bewegt habe. Ändern Sie Ihr Podfile wie folgt:

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

Danke, aber ich habe es gerade versucht und ich habe immer noch die Ausgabe "Klasse ... ist in beiden implementiert ...".
Doovers

1
Es hat bei mir funktioniert, aber es macht für mich immer noch keinen Sinn. Es ist nicht das erste Mal, dass ich Firebase sagen kann, dass sie ihre Podspecs seltsam einrichten, vgl. twitter.com/dirtyhenry/status/836240557311684608, aber das Firebase-Team antwortet nicht :(
Dirty Henry

4
Durch diese Änderung wurde die Warnung nicht sofort gelöscht, sie wurde jedoch nach dem Ausführen behoben pod install.
Blwinters

Halbes Problem gelöst. und die andere Hälfte wird gelöst, indem Sie "$ {PODS_ROOT} / Firebase / Core / Sources" zu Ihrem
Testziel

Nachdem Sie diese Änderung vorgenommen haben, vergessen Sie nicht, sie auszuführen, pod installum die Projektabhängigkeiten zu aktualisieren;)
jawad

56

Versuchen Sie, die Vererbung wie folgt zu ändern :complete:

target 'MyAppTests' do
    inherit! :complete
end

Wichtig ist, dass jeder andere, der Ihr Repo auscheckt, pod updatewie gewohnt ein Repo ausführen kann, ohne .xcconfigDateien oder andere Hackerangriffe kopieren zu müssen, um sie zu erstellen.


1
Dies hat auch die Ausgabe "Klasse ... ist in beiden implementiert ..."
Diogo T

Es ließ den Kompilierungszeitfehler verschwinden, verursachte aber diesen zur Laufzeit: clang: error: Linker-Befehl fehlgeschlagen mit Exit-Code 1 (benutze -v, um den Aufruf zu sehen)
CMont

Hat auch für mich gearbeitet! Danke :)
smapps

52
  1. Wählen Sie Ihre Unit Test Target-Einstellung.
  2. Gehen Sie zu Build Settings.
  3. Suchen Sie nach Header-Suchpfaden.
  4. Fügen Sie diesen Wert $ (SRCROOT) / Pods mit rekursiv hinzu, dann löst Xcode den Pfad für Sie auf.

Beispiel


1
Vielen Dank @Kanika Sharma
Rahul K Rajan

34

Das Problem ist, dass Firebase mit den Header-Suchpfaden etwas Besonderes macht, nachdem CocoaPods einen eigenen Wert für die Einstellung generiert hat, sodass CocoaPods diese Änderung nicht übernimmt, um sie auf das Testziel zu übertragen. Sie können dies auf zwei Arten lösen:

  1. Suchen Sie MyAppTests.<configuration>.xcconfigim Datei-Navigator und fügen Sie Folgendes hinzu HEADER_SEARCH_PATHS:

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

  2. Suchen Sie die Einstellung für Header-Suchpfade in den Build-Einstellungen und fügen Sie der Liste denselben Wert wie in Option 1 hinzu. Sie sollten es nicht als rekursiv festlegen müssen.

* ${PODS_ROOT}/Firebase/Core/SourcesGemäß dem Kommentar von AKM wurde dies in Version 3.14.0 geändert


Versuchte das, bekam aber immer noch die gleichen Warnungen
doovers

8
Ab Firebase 3.14.0 Diese Lösung ist gültig, der Patch wurde jedoch in${PODS_ROOT}/Firebase/Core/Sources
AKM

1
Ein neuer Weg hat auch für mich funktioniert! Ich verwende CocoaPods Version 1.2.0 , aber denke daran , dass ich auch inherit! :search_pathsdas Testziel in der hinzufügen musste Podfile.
Paulo Mattos

2. funktioniert bei mir nicht. Verwenden von Firebase 3.x (nicht das neueste 4.x)
Jonny


7

Drei Schritte, bevor ich das zum Laufen bringen konnte:

CocoaPods: 1.5.0 Swift 4 Firebase: 4.13.0

Schritt 1: Stellen Sie sicher, dass Sie den folgenden Zielblock zu Ihrer Poddatei hinzufügen.

# 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

Schritt 2: Auf der Registerkarte Build-Einstellungen von YourAppTests Project Navigator. Suchen Sie die Zeile Header Search Path und fügen Sie die folgende Zeile zum Debuggen hinzu

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

Schritt 3: Im Terminallauf:

Pod Update


7

Das Problem wird hier im Firebase-Projekt aufgezeichnet:

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

Es gibt eine Problemumgehung:

Fügen Sie "$ {PODS_ROOT} / Firebase / Core / Sources" nur unter Build-Einstellungen -> Header-Suchpfade zu Ihrem Testziel hinzu

Dies wird jedoch auch durch ein Upgrade auf CocoaPods 1.4.0 oder höher behoben, was eine bessere Lösung darstellt.

Zum Zeitpunkt des Schreibens (November 2017) befindet sich cocoapods 1.4.0 noch in der Beta. Um es zu installieren, müssen Sie die Beta explizit anfordern:

gem install cocoapods --pre

Dies und dann ein pod installProblem zu lösen, das meine Tests ausführt.


1
Was ist das "PODS_ROOT"?
ArgaPK

@ArgaPK Es ist eine Variable, die Cocoapods setzt. Fügen Sie einfach genau das, was ich zwischen den "" s geschrieben habe, in Xcode ein. Der beste Weg ist, Ihre CocoaPods auf> = 1.4.0 zu aktualisieren.
JosephH

1
@JosephH Das Aktualisieren meiner Cocoapods auf 1.5.2 hat das Problem leider nicht gelöst.
Stacy Smith

@AnastasiaKovaleva bist du pod installnach dem Upgrade gelaufen ?
JosephH

@ JosephH Running hat pod installmein Problem gelöst! Vielen Dank!
Stacy Smith

4

Die Lösung für mich war, Cocoapods auf Version 1.1.0.rc.2 zu aktualisieren.

sudo gem install cocoapods --pre


Leider funktioniert es bei mir nicht ... Ich muss meine Gegenstimme zurücknehmen!
Zeb

Tut mir leid, es hat euch nicht geholfen, ich
bin

Ich bin am 1.20 und kein Glück
UKDataGeek

4

Ich habe alles oben Genannte ausprobiert und bin auf verschiedene Fehler gestoßen, die ursprünglich damit begannen Missing required module 'Firebase', dann "Class ... is implemented in both ... "Probleme mit dem Linker zu bekommen oder zu verknüpfen, wenn ich versuchte, meinem Testziel Firebase-Pods hinzuzufügen.

Die Lösung, die für mich funktioniert hat, war:

  1. Entfernen Sie das Testziel vollständig aus Podfile und führen Sie 'pod update' aus, um sicherzustellen, dass das XCode-Projekt synchron ist.
  2. Öffnen Sie die Build-Einstellungen meines Testziels und aktualisieren Sie die Header-Suchpfade so, dass sie nur die folgenden 3 Elemente enthalten:
    • $(inherited) non-recursive
    • $(SRCROOT)/Pods/Headers/Public recursive
    • $(SRCROOT)/Pods/Firebase recursive

Zu diesem Zeitpunkt hat es für mich funktioniert, den Build-Ordner zu bereinigen, neu zu erstellen und dann die Tests erneut auszuführen. Hoffe das hilft jemandem!


Nachdem ich alles andere in diesem Thread ausprobiert hatte, war dies die einzige Antwort, die die Dinge für mich zum Laufen brachte. Danke dir!
Ali Parr

4

Das Hinzufügen ${SRCROOT}/Pods/Firebase/CoreOnly/Sourcesder "Header-Suchpfade" des Unit-Test-Ziels hat das Problem behoben. Schritte:

  1. Wählen Sie Ihr Unit-Test-Ziel
  2. Gehen Sie zu Build Settings
  3. Suche nach Header-Suchpfad
  4. Fügen Sie $ {SRCROOT} / Pods / Firebase / CoreOnly / Sources hinzu

Geben Sie hier die Bildbeschreibung ein

Danach können die Tests ausgeführt werden und der Fehler verschwindet.


2

Ich hatte ein ähnliches Problem. In Bezug auf Ihre Frage habe ich den Inhalt meiner MyApp.<configuration>.xcconfigDatei in meine MyAppTests.<configuration>.xcconfigDatei kopiert . Ich habe die Tests gereinigt und gebaut, und es hat funktioniert.


Dies war die einzige Lösung, die für mich funktioniert hat. Vielen Dank! Ich denke darüber nach, eine Nachinstallationsverarbeitung in der Pod-
Datei


1

Wie @Will erwähnte, gab es nach der Installation von CocoaPods ein Problem mit Header- Suchpfaden.

Ich habe ein Projekt mit mehreren Zielen, bei dem der Pod 'Firebase' beispielsweise in ein separates Modul eingebettet ist MyProject-Shared. Firebase-Pod unter 'Podfile' nur für das Ziel 'MyProject-Shared' installiert. Andere Module, die 'MyProject-Shared' verwenden möchten, können aufgrund eines Fehlers nicht kompiliert werden:

'fehlendes erforderliches Modul "Firebase"'

In meinem Fall bestand der Trick darin, den folgenden fehlenden Header-Suchpfad in den Build-Einstellungen jedes Ziels hinzuzufügen, die auf Analytics-Framework verweisen :

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

Bitte siehe Bild unten: Header-Suchpfad

Hoffe, es wird Ihre Zeit sparen.


1

Eine einfachere Methode, die auch funktioniert:

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

    target :MyAppTests
end

0

Missing required module Firebase KEINE CocoaPods-Lösung

Für diejenigen, die auf dasselbe Problem stoßen, aber KEINE CocoaPods verwenden:

Wenn Sie Firebase verwenden, haben Sie einen Ordner mit Firebase.hund module.modulemapDatei. Zum Beispiel -YOUR_PROJECT_DIR/Linking

Wenn Ihr Hauptprojektziel ordnungsgemäß funktioniert, gehen Sie zu ProjectSettings -> Targets. Testziel auswählen. Suchen Sie nach User headersdem Pfad und fügen Sie ihn hinzu YOUR_PROJECT_DIR/Linking. Wählen Sie die recursiveOption und Sie sollten bereit sein zu gehen.

Weitere Details finden Sie im Screenshot:

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.