it-swarm.com.de

Xcode-Einheitstest mit Kokosapoden

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

Ich versuche nur, einige Komponententests für meine App zu erstellen, die Firebase-Pods verwenden.

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

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 voller Warnungen, z.

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

86
doovers

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

Sudo gem install cocoapods --pre

3
doovers

Ich hatte das gleiche Problem. Ich habe es gelöst, indem ich pod 'Firebase' zu meinem Testziel verschoben habe. Ändern Sie Ihre Pod-Datei folgendermaßen:

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
65
Mackarous

Ändern Sie die Vererbung in :complete, wie in:

target 'MyAppTests' do
    inherit! :complete
end

Es ist wichtig, dass alle anderen, die Ihr Repo auschecken, wie gewohnt einen pod update ausführen können, ohne .xcconfig-Dateien oder andere Hacker-Dateien kopieren zu müssen, um sie zu erstellen.

43
Andy Chou

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

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

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

  2. Suchen Sie nach den Einstellungen für Header Search Paths in den Build-Einstellungen und fügen Sie der Liste den gleichen Wert wie in Option 1 hinzu. Sie sollten es nicht als rekursiv festlegen müssen.

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

32
Will
  1. Wählen Sie Ihre Unit-Testzieleinstellung.
  2. Gehen Sie zu den Build-Einstellungen.
  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

22
Kanika Sharma

Das Problem wird im Firebase-Projekt hier aufgezeichnet:

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

Es gibt eine Problemumgehung:

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

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

Zum Zeitpunkt der Erstellung dieses Dokuments (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 install löste das Problem bei meinen Tests.

6
JosephH

Drei Schritte bevor ich es schaffen konnte:

CocoaPods: 1.5.0 Swift 4 Firebase: 4.13.0

Schritt 1: Vergewissern Sie sich, dass Sie den folgenden Zielblock in Ihre Pod-Datei einfü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 Ihres YourAppTests Project Navigator. Suchen Sie die Zeile mit dem Header-Suchpfad, und fügen Sie die folgende Zeile in Debug

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

Schritt 3: Im Terminallauf: 

pod-Update

4
Dennis

Ich habe alles oben Genannte ausprobiert und bin auf verschiedene Fehler gestoßen, angefangen mit Missing required module 'Firebase', Bis ich dann "Class ... is implemented in both ... " Oder Linkerprobleme bekam, wenn ich versuchte, meinem Testziel Firebase-Pods hinzuzufügen.

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

  1. Entfernen Sie das Testziel vollständig aus dem 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 nur die folgenden 3 Elemente enthalten sind:
    • $(inherited) non-recursive
    • $(SRCROOT)/Pods/Headers/Public recursive
    • $(SRCROOT)/Pods/Firebase recursive

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

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

2
Jason

Fügen Sie "$ {PODS_ROOT}/Firebase/Core/Sources" nur unter Build Settings -> Header Search Paths zu Ihrem Testziel hinzu.

1

Wie @ Will ein Problem im Zusammenhang mit Header-Suchpfaden nach der Installation von CocoaPods erwähnte.

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

'fehlendes erforderliches Modul "Firebase"'

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

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

Bitte siehe Bild unten: Header Search Path

Hoffe, es wird Ihre Zeit sparen.

Das Problem wurde behoben, indem ${SRCROOT}/Pods/Firebase/CoreOnly/Sources in die "Header-Suchpfade" des Unit-Test-Ziels eingefügt wurde. Schritte:

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

enter image description here

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

0