XCTest / XCTest.h wurde in alten Projekten, die in Xcode 6 erstellt wurden, nicht gefunden

81

Ich habe einige Projekte, die ich mit Xcode 6 Beta 2 erstellen möchte. Alle Projekte verfügen über eine Bibliothek, die XCTest (Kiwi / XCTest und Specta) verwendet und nicht in Xcode 6 erstellt wird, da XCTest / XCTest.h dies nicht kann gefunden werden.

fatal error: 'XCTest/XCTest.h' file not found
#import <XCTest/XCTest.h>

Ich habe festgestellt, dass XCTest.framework nicht mehr in der Build-Phasenliste "Bibliotheken mit Binärdateien verknüpfen" enthalten ist. Dies ist jedoch in Ordnung, da beim Erstellen eines neuen Projekts mit Xcode 6 die Bibliothek automatisch verknüpft wird.

Vielleicht von einiger Relevanz, werden meine XCTest-benötigten Abhängigkeiten alle über Cocoapods eingebracht.

Gibt es etwas, von dem ich nicht weiß, dass ich es mit meinem Projekt aktualisieren muss?

Erik Kerber
quelle

Antworten:

142

Hinweis: Dies ist möglicherweise nicht für Projekte erforderlich, die in Xcode 7 erstellt wurden.

CocoaPods hatte hier und hier eine Lösung dafür


Um dies für alle CocoaPod-Abhängigkeiten zu beheben, müssen Sie FRAMEWORK_SEARCH_PATHSin jedem Pod-Ziel, das XCTest erfordert (z. B. Kiwi, Specta, FBSnapshotTestCase usw.), Folgendes hinzufügen.

$(PLATFORM_DIR)/Developer/Library/Frameworks

Bildschirmfoto

Auf diese Weise können Sie in eventuellen Abhängigkeiten auf XCTest verweisen. Dies kann in einem zukünftigen Update von CocoaPods oder dem Pod, auf den Sie verweisen, behoben sein, sodass Sie ihn möglicherweise später entfernen möchten.

Es ist nicht schädlich für frühere Versionen von Xcode und sollte daher sicher zu verwenden sein.

Quadratfrosch
quelle
Danke Squarefrog. Das relevante Problem ist hier
Fatuhoku
1
Wann ist die nächste Veröffentlichung geplant?
Fatuhoku
6
Dies scheint nicht mit KIM in xcode 6 GM zu funktionieren ..?
Thomas Clowes
3
Ich bin nicht einverstanden mit "nicht relevant für Xcode 7". Ich hatte das Problem in Xcode 7.1. Das Problem verschwand, nachdem ich diesen Framework-Suchpfad wie oben beschrieben hinzugefügt hatte. Ich gehe davon aus, dass ein in Xcode 7 gestartetes Projekt nicht das Problem hat, aber die Frage hier ist, ältere Projekte in neueren Xcodes zu erstellen.
Jerry Krinock
1
Ab XCode 9 sollten Sie die Build-Einstellung FRAMEWORK_SEARCH_PATHS auf $ (DEVELOPER_FRAMEWORKS_DIR) und $ (geerbt) setzen
berbie
40

Ich habe Dateien in einem Projekt verschoben. Alles, was Sie tun müssen, ist, Ihre Testdateien xxxTests.musw. file inspectorauszuwählen und targetals testund nicht als reguläres Ziel auszuwählen .

Jakub Truhlář
quelle
1
Genau das, was mir passiert ist. Ich habe nicht bemerkt, dass sich das Ziel für die Datei "geändert" hat, als ich es verschoben habe. Ich hätte darüber nachdenken sollen, wie es verschoben wurde (in Xcode löschen und erneut hinzufügen). Vielen Dank.
Chadbag
1
einfache Antwort, die für mich funktioniert hat. Hatte Probleme beim Umbenennen meiner Dateien, und dies war die Lösung in meinem Fall.
Simon
17

Ich habe festgestellt, dass XCTest nur für ein Testziel verfügbar ist (in Xcode 6). Wenn Sie XCTest für ein anderes Ziel verwenden (aus welchem ​​Grund auch immer), wird der XCTest.h not foundFehler angezeigt .

Mustafa
quelle
Das ist es. Cocoapods erstellt statische Bibliotheksprojekte / -ziele. Guter Fund!
Erik Kerber
1
Sie müssen höchstwahrscheinlich den gesamten XCTest-bezogenen Code auf ein Testziel verschieben.
Mustafa
Was schwierig ist, wenn Sie CocoaPods verwenden, um Kiwi oder Specta in Ihr Projekt aufzunehmen.
Squarefrog
2
Also ... was ist das Problem?
Fatuhoku
11

@squarefrog hat die richtige Antwort, aber Sie müssen dies jedes Mal manuell tun, wenn Sie Ihre Pods aktualisieren :(

Wenn Sie dies zu Ihrer Poddatei hinzufügen, wird automatisch der zusätzliche Pfad für Sie hinzugefügt. Zum Beispiel , wenn Sie will hinzufügen , $(PLATFORM_DIR)/Developer/Library/Frameworksum FRAMEWORK_SEARCH_PATHSfür Specta:

post_install do |installer|
    target = installer.project.targets.find { |t| t.to_s == "Pods-Tests-Specta" }
    if (target)
        target.build_configurations.each do |config|
            s = config.build_settings['FRAMEWORK_SEARCH_PATHS']
            s = [ '$(inherited)' ] if s == nil;
            s.push('$(PLATFORM_DIR)/Developer/Library/Frameworks')
            config.build_settings['FRAMEWORK_SEARCH_PATHS'] = s
        end
    else
        puts "WARNING: Pods-Tests-Specta target not found"
    end
end
DeanWombourne
quelle
Beachten Sie, dass Sie möglicherweise Änderungen "Pods-Tests-Specta"vornehmen müssen, um sie an Ihre Projekteinstellungen anzupassen, oder verwenden Sie einfach die von @squarefrog vorgeschlagene Schleife, um über jedes Ziel zu iterieren.
pix0r
1
Ich habe falsch geschrieben - @squarefrog hat keine Schleife vorgeschlagen. Was ich meine, ist, die Zeilen 2-3 in der Lösung von @ deanWombourne durch zu ersetzen: installer.project.targets.each do |targetum alle Ziele zu durchlaufen und die Änderung anzuwenden.
pix0r
11

Dieser Fehler tritt auf, wenn Sie eine Datei hinzugefügt haben, in der XCTest außerhalb eines Testziels verwendet wird. Um dies in AppCode zu beheben, können Sie mit der rechten Maustaste auf eine verdächtige Datei klicken und "Ziele verwalten" auswählen. Stellen Sie dann sicher, dass nur das Testziel aktiviert ist.

Tash Pemhiwa
quelle
Ich bin mehr als einmal auf dieses Problem gestoßen.
Pshah
Dies geschah mir, nachdem ich Dateien in einem Projekt verschoben und unter dem falschen Ziel erneut hinzugefügt hatte.
Giles
2

Nach einiger Zeit habe ich das gleiche Problem festgestellt. Ich habe das XCTest-Framework aus den Erstellungsphasen importiert und das Problem behoben.

Phasen erstellen-> XCTest.Framework> bereinigen und ausführen. Ich hoffe es wird jemandem helfen ..

als Referenz ... Importieren Sie XCTest in ein vorhandenes Projekt

Narasimha Nallamsetty
quelle
Dies funktionierte für mich, aber ich musste auch zu den Zieleinstellungen für die neuen Tests gehen und auf der Registerkarte Allgemein das Kontrollkästchen zum Testen der APIs der App aktivieren.
Fran K.
1

Zum Zeitpunkt des Schreibens hat die neueste Version von Cocoapods (0.33.1) keine Lösung für das Problem.

Aber die neueste Version tut es.

Befolgen Sie diese Anleitung , um die neueste Version von Cocoapods von der Quelle aus einzurichten. Ich rufe meine an pod-dev(in der Anleitung behandelt), um sie von der gem-installierten Version von Pods zu unterscheiden.

Der Vorteil dieses Ansatzes besteht darin, dass Sie keine zusätzlichen Skripte in Ihrem Podfile benötigen. Sie müssen nur daran denken, eine pod-dev installstatt der üblichen zu tun pod install.

Fatuhoku
quelle
1

Der beste Weg, einen XCTest zu haben, besteht darin, ihn über den Test Nagigator (5. Symbol im linken Bereich) hinzuzufügen.

Auf diese Weise zielt die neue xx.m-Testdatei nicht auf eine App (im rechten Bereich) (im linken Bereich> Ziel, Wrapper-Erweiterung: App) ab, sondern auf ein Bundle (Wrapper-Erweiterung: xctest).

  • Das XCTest.framework bleibt in Rot.
  • Aufgrund einiger Änderungen kann der Fehler auftreten 'XCTest/XCTest.h' file not found, da Ihre Datei auf eine App abzielen musste.
tontonCD
quelle
0

Dies ist die einfachste Lösung, die ich gefunden habe. Es sind keine Projektänderungen erforderlich. Diese Änderung bleibt bis zu Ihrem nächsten Xcode-Upgrade bestehen:

cd /Applications/Xcode6-Beta7.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/Developer/Library/Frameworks
ln -s ../../../../../Library/Frameworks/XCTest.framework
Steven Kramer
quelle
Der Nachteil dabei ist, dass Sie Ihr Projekt bei jedem Xcode-Update für andere freigeben, da diese diese Aktion ausführen müssen. Dies ist ein Problem bei der Implementierung von Cocoapods, daher ist es sinnvoll, es mit Cocoapods zu lösen!
Squarefrog
Einverstanden. Und das ist nicht perfekt. Aber es ist ganz einfach und lässt sich gut mit der Anzahl der Pods skalieren (O (1)). Die Anzahl der Xcode 6-Versionen sollte ebenfalls begrenzt werden :-)
Steven Kramer
Das Hinzufügen des Pfads zu den Framework-Suchpfaden scheint ihn nicht zu beeinträchtigen: Tests werden erstellt, aber nicht ausgeführt. Anscheinend, weil das Testpaket das XCTest-Framework nicht auflösen kann.
Steven Kramer
0

Bei einem Projekt ohne Cocoapods (also nicht direkt auf die Frage des OP, aber vielleicht hilfreich für mich oder andere in der Zukunft) hatten wir das gleiche Problem. Es wurde gelöst, indem unsere vorherigen OCTest-Elemente durch XCTest ersetzt wurden. Beispielsweise hat eine Datei MyApp.xcodeproj / project.pbxproj diesen Unterschied (verkürzt); - path = MyAppUnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + path = MyAppUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };

AnneTheAgile
quelle