Ich versuche, einige iOS-Logiktests für Klassen in meinem Projekt zu schreiben, die Funktionen aus einigen Bibliotheken in meiner Podspec verwenden. Ich verwende das in Xcode bereitgestellte Standard-Unit-Test-Bundle (obwohl keine Anwendungstests, sondern nur Unit-Tests).
Zum Beispiel verwende ich Magical Record und habe diese Bibliothek in meiner Podspec verlinkt. Es ist im Pods-Projekt in meinem Arbeitsbereich vorhanden und funktioniert wie erwartet, wenn die App im Simulator oder auf dem Gerät ausgeführt wird. Wenn ich versuche, das Objekt, das Magical Record verwendet, mit dem Test zu verknüpfen, wird jedoch ein Linkerfehler angezeigt, der besagt, dass die Selektoren von Magical Record nicht gefunden werden können. Ich habe versucht, mein HEADER_SEARCH_PATH in meinem Logiktest-Bundle zu aktualisieren und es sogar hart in das von CocoaPods erstellte Header-Verzeichnis zu codieren, aber kein Glück.
Ich kann problemlos Unit-Tests für Klassen ausführen, die keine CocoaPods-Bibliotheken verwenden.
Mache ich das falsch? Sollte ich etwas anderes tun, damit der Compiler die CocoaPods-Bibliotheken sieht?
quelle
isSubclassOfClass:
kehren Anrufe dorthin zurück,NO
wo sie zurückkehren sollenYES
. Der einzige Grund, warum ich dies erklären kann, ist, dass die Abhängigkeiten tatsächlich sowohl mit dem Haupt- als auch mit dem Testziel verknüpft werden. Wenn der Bundle Loader des Testziels das Hauptpaket lädt, kann er nicht entscheiden, welche Klasse verwendet werden soll.isKindOfClass:
Rückkehr,NO
wenn es zurückkehren sollteYES
. Wenn ich den Zeiger auf dasClass
Objekt, das ich teste, und dasClass
der Klasse, mit der ich vergleichen möchte, protokolliere, sind dies zwei verschiedene Werte. Offensichtlich verwendet mein Code aus dem App-Bundle ein anderes Symbol für die Klasse als der Code aus meinen Unit-Tests. Hat jemand einen Weg gefunden, dies zu lösen?Ich habe dies herausgefunden, indem ich mir angesehen habe, wie das Hauptziel meiner App darin bestand, Einstellungen von der CocoaPods-Bibliothek zu erhalten. CocoaPods enthält eine .xcconfig-Datei mit dem Namen Pods.xcconfig. Diese Datei enthält alle Header-Suchpfade.
Wenn Sie sich Ihr Projekt im Projektnavigator ansehen und auf die Registerkarte Info klicken, werden Ihre Build-Konfigurationen im oberen Bereich aufgelistet. Wenn Sie das Offenlegungsdreieck für Ihre verschiedenen Konfigurationen öffnen, werden Pods unter Ihrem Hauptziel aufgelistet. Ich musste auf das Dropdown-Menü klicken und dem logischen Testziel auch Pods hinzufügen.
Ich musste auch die Einstellungen von
$(inherited)
und${PODS_HEADERS_SEARCH_PATHS}
von meinem Hauptziel kopieren und sie unter Build-Einstellungen / HEADER_SEARCH_PATHS auf das logische Testziel kopieren.Schließlich musste ich libPods.a in der Build-Phase Link Binary with Libraries für mein Ziel für Logiktests hinzufügen.
Hoffe, dies kann jemand anderem helfen.
quelle
Es gibt eine Lösung, die ich hier gefunden habe. Unit-Tests mit CocoaPods :
Öffnen Sie die Projektdatei in Xcode und wählen Sie dann das Projekt (nicht das Ziel) aus. Im rechten Bereich befindet sich ein Abschnitt namens Konfigurationen. Wählen Sie Pods in der Spalte "Basierend auf Konfigurationsdatei" für Ihr Testziel.
quelle
Specta
die Sie mit dem Testprojekt verknüpfen möchten, aber nicht mit dem Hauptprojekt? : SClass Foo is implemented in both MyApp and MyAppTestCase. One of the two will be used. Which one is undefined.
Dies scheint durch einen Fehler in Cocoapods verursacht zu sein; siehe @ JRV Antwort unten.Ich stimme den anderen Antworten zu und sage, dass es notwendig ist, die Bibliotheken mit den Testzielen zu verknüpfen. Keiner der bisherigen Vorschläge hat mir jedoch geholfen. Wie @fabb in einem Kommentar schreibt: "Beim Testen geben
isSubclassOfClass:
Aufrufe NEIN zurück, wo sie JA zurückgeben sollten. Der einzige Grund, warum ich dies erklären kann, ist, dass die Abhängigkeiten wirklich sowohl mit dem Haupt- als auch mit dem Testziel verknüpft werden und wenn das Paket des Testziels Der Loader lädt das Hauptpaket und kann nicht entscheiden, welche Klasse er nehmen soll. " Ich habe das gleiche Problem mit allen vorherigen Vorschlägen in diesem Thread.Die Lösung, die ich zur Arbeit bekam, bestand darin, meine Poddatei zu aktualisieren, um bestimmte Pods für mein Hauptziel und mein Testziel zu definieren:
Es war notwendig , einen Pod für mein Testziel anzugeben, obwohl ich keine testspezifischen Pods verwendet habe. Andernfalls würde CocoaPods nicht die erforderliche Verknüpfungslogik in mein Projekt einfügen.
Dieser Link hat mir geholfen, zu diesem Schluss zu kommen.
quelle
Ich habe hinzugefügt
:exclusive => true
, um doppelte Symbolfehler im Anwendungstestziel zu vermeiden.Wenn ich das Anwendungstestziel in das Logikeinheitstestziel geändert habe, tritt der Linkerfehler auf. Nachdem ich entfernt habe
:exclusive => true
, funktioniert alles wieder.:exclusive => true
gibt an, dassdo...end
NICHT alles außerhalb mit verknüpft werden solltemyProjectTests
, was bei Anwendungstestzielen sinnvoll ist, aber bei logischen Testzielen Linkerfehler verursacht.quelle
Sie können link_with gemäß der @ Keith Smiley-Lösung verwenden.
Wenn Sie gemeinsame Pods und Besonderheiten für jedes Ziel haben, können Sie die Option "def" verwenden, um eine Gruppe von Pods zu definieren. und benutze das "def" später im exklusiven Ziel.
Im obigen Beispiel habe ich den beiden Zielen 'SSKeychain' und 'Typhoon' nur dem Ziel 'MyProject' hinzugefügt
quelle
Meine Lösung für dieses Problem bestand darin, mein Podfile so zu ändern, dass die Bibliothek in beiden Zielen wie diesem enthalten ist
Und da ich swift verwende, musste ich auch das Testziel so konfigurieren, dass es die
MyApp-Bridging-Header.h
Datei enthält. (In der Swift Compiler-Gruppe unter der Registerkarte Build Settings)quelle
Pods
Projekt. Wenn Sie Ihre Pods zweimal erwähnen (einmal für Tests und einmal für die App), haben Sie zwei Zielgruppen. Dies verdoppelt effektiv den Konfigurationsaufwandpod install
. Dies wird kein Problem sein, bis Sie> 15 Pods haben. Machen Sie sich also bis dahin keine allzu großen Sorgen.Ich hatte ein ähnliches Ereignis, als ich während einer Versionskontrolle einige Bibliotheksdateien verlor. Ich habe die Bibliotheksdatei immer noch in meinen Pods gesehen, aber da der eigentliche Code fehlt, hat XCode gesagt, dass er weg ist. Zu meiner Bestürzung brachte das Ausführen von 'pod install' die verlorenen Dateien nicht sofort zurück.
Ich musste den Pod manuell entfernen und ersetzen, indem ich Folgendes tat:
Dies sollte die betreffende Bibliothek wieder in ihre ursprüngliche Form bringen.
quelle
Es ist auch erwähnenswert, dass, wenn Sie
libPods.a
zweimal hinzugefügt haben , Sie einen bösen Fehler wie diesen erhalten:Um dies zu beheben, löschen Sie einfach eine der
libPods.a
Referenzen in Ihrem Projektexplorer.quelle
Ab CocoaPods 1.x gibt es eine neue Möglichkeit, gemeinsame Abhängigkeiten zwischen einem Ziel und dem entsprechenden Testziel zu deklarieren. Ich hatte bis jetzt die von Mark Struzinski akzeptierte Lösung verwendet, aber die Verwendung dieser Methode ergab eine große Anzahl von Warnungen, als ich meine Tests ausführte, die:
Mit CocoaPods 1.x können wir unser -Test-Ziel über die Suchpfade des übergeordneten Ziels als erben deklarieren, wie folgt:
Dies führt dazu, dass das -Test-Ziel ohne mehrere binäre Kopien Zugriff auf die Abhängigkeiten des App-Ziels hat. Dies hat die Testaufbauzeiten für mich erheblich verkürzt.
quelle
Versuchen Sie das, es funktioniert für mich,
Wir müssen Pods in Konfigurationen setzen,
Die Projekt-> Info-> Konfigurationen im Xcode-Projekt (Ihr Projekt) sollten für Debug, Release (und was Sie sonst noch haben) auf das Hauptprojekt 'Pods' eingestellt sein. Siehe "Header nicht gefunden - Suchpfade nicht enthalten"
Hoffe das ist Hilfe für jemanden.
quelle
Ich arbeite mit der GoogleMaps Objective-C POD-Integration unter iOS mit meiner Swift-App. Für mich bestand das Problem darin, dass das Testziel keinen Verweis auf die Bridge-Header-Datei ( SWIFT_OBJC_BRIDGING_HEADER ) in den Build-Einstellungen hatte. Stellen Sie sicher, dass sowohl Ihre App- als auch Ihre Test-App-Ziele darauf verweisen, damit die API-Aufrufe von Drittanbietern (Karten-API usw.) in schnellen Komponententests verwendet werden können.
quelle
import GoogleMaps
.Die nächste Syntax liefert für mich das beste Ergebnis (getestet unter cocoapod v.1.2.1):
https://github.com/CocoaPods/CocoaPods/issues/4626#issuecomment-210402349
Ohne dies habe ich während des Testlaufs Warnungen über doppelte Symbole.
Danach verschwanden die Warnungen.
quelle
Ich hatte Probleme mit OpenCV unter XCTest. Es gab mir Linker-Fehler
Undefined symbols for architecture arm64
für Klassen wiecv::Mat
. Ich installiere OpenCV über CocoaPodspod 'OpenCV', '~> 2.0'
unter dem Hauptziel. Egal wie sehr ich versucht habe, die OpenCV-Abhängigkeit unter das Testziel zu stellen oderinherit! :search_paths
nichts davon zu verwenden, hat funktioniert. Die Lösung bestand darin, einabstract_target
ähnliches zu erstellen :Ebenfalls nützlich sind die Befehle
pod deintegrate
&pod clean
, mit denen Sie das Projekt bereinigen und sicherstellen können, dass Sie beim Testen neu beginnen. Sie können diese beiden mit installieren[sudo] gem install cocoapods-deintegrate cocoapods-clean
.quelle