Nie znaleziono XCTest / XCTest.h w starych projektach zbudowanych w Xcode 6

82

Mam kilka projektów, które próbuję zbudować za pomocą Xcode 6 Beta 2. Wszystkie projekty mają jakąś bibliotekę używającą XCTest (Kiwi / XCTest i Specta), które nie są budowane w Xcode 6, ponieważ XCTest / XCTest.h nie może być znalezionym.

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

Zauważyłem, że XCTest.framework nie znajduje się już na liście faz budowania "Link Libraries with Binaries", ale to jest w porządku, ponieważ kiedy tworzę nowy projekt z Xcode 6, wydaje się, że biblioteka jest podłączana automatycznie.

Być może ma to jakieś znaczenie, wszystkie moje zależności wymagające XCTest są przenoszone przez Cocoapods.

Czy jest coś, o czym nie wiem, co muszę zaktualizować w swoim projekcie?

Erik Kerber
źródło

Odpowiedzi:

142

Uwaga: może to nie być potrzebne w przypadku projektów utworzonych w Xcode 7.

CocoaPods miało na to poprawkę tu i tutaj


Aby to naprawić dla wszelkich zależności CocoaPod, musisz dodać następujące elementy FRAMEWORK_SEARCH_PATHSw dowolnym celu Pod, który wymaga XCTest (np. Kiwi, Specta, FBSnapshotTestCase itp.).

$(PLATFORM_DIR)/Developer/Library/Frameworks

zrzut ekranu

Umożliwi to odwoływanie się do XCTest we wszelkich zależnościach, jakie możesz mieć. Może to zostać naprawione w przyszłej aktualizacji CocoaPods lub poda, do którego się odnosisz, więc możesz chcieć go później usunąć.

Nie jest szkodliwe dla wcześniejszych wersji Xcode, więc powinno być bezpieczne w użyciu.

kwadratowa żaba
źródło
Dziękuję Squarefrog.
Istotna
1
Kiedy zaplanowane jest następne wydanie?
fatuhoku
6
Wydaje się, że to nie działa z KIM w xcode 6 GM ..?
Thomas Clowes,
3
Nie zgadzam się z wyrażeniem „nie dotyczy Xcode 7”. Miałem problem w Xcode 7.1. Problem zniknął po dodaniu ścieżki wyszukiwania frameworka zgodnie z powyższym opisem. Zakładam, że projekt rozpoczęty w Xcode 7 nie będzie miał problemu, ale kwestia tutaj polega na budowaniu starszych projektów w nowszych Xcodes.
Jerry Krinock
1
od XCode 9 powinieneś ustawić ustawienie kompilacji FRAMEWORK_SEARCH_PATHS na $ (DEVELOPER_FRAMEWORKS_DIR) i $ (
inherited
40

Przenosiłem pliki w projekcie. Wszystko, co musisz zrobić, to wybrać pliki testowe xxxTests.mitp. I file inspectorwybrać targetjako, testa nie jako zwykły cel.

Jakub Truhlář
źródło
1
Dokładnie to, co mi się przydarzyło. Nie zauważyłem, że kiedy go przenosiłem, cel dla pliku "zmienił się". Powinienem był pomyśleć o tym na podstawie tego, jak został przeniesiony (usuń w Xcode i dodaj ponownie). Dzięki.
chadbag
1
prosta odpowiedź, która mi pomogła. Miałem problemy, kiedy zmieniałem nazwy moich plików, i to było rozwiązanie w moim przypadku.
Simon,
17

Zauważyłem, że XCTest jest dostępny tylko dla celu testowego (w Xcode 6). Jeśli używasz XCTest do innego celu (z jakiegokolwiek powodu), zobaczysz XCTest.h not foundbłąd.

Mustafa
źródło
Otóż ​​to. Cocoapods tworzy projekty / cele bibliotek statycznych. Dobre znalezisko!
Erik Kerber
1
Najprawdopodobniej będziesz musiał przenieść cały kod związany z XCTest do celu testowego.
Mustafa
Co jest trudne, jeśli używasz CocoaPods do włączenia Kiwi lub Specta do swojego projektu.
squarefrog
2
Więc ... co na to poradzi?
fatuhoku
12

Ten błąd pojawia się po dodaniu pliku, w którym XCTest jest używany poza celem testowym. Aby naprawić to w AppCode, możesz kliknąć prawym przyciskiem myszy podejrzany plik i wybrać `` Zarządzaj celami '', a następnie upewnić się, że zaznaczony jest tylko cel testowy.

Tash Pemhiwa
źródło
Napotkałem ten problem więcej niż raz.
pshah
Zdarzyło mi się to po przeniesieniu plików w projekcie i ponownym dodaniu ich pod niewłaściwym miejscem docelowym.
Giles
11

@squarefrog ma właściwą odpowiedź, ale będziesz musiał to robić ręcznie za każdym razem, gdy aktualizujesz swoje pody :(

Jeśli dodasz to do swojego pliku podfile, automatycznie doda to dodatkową ścieżkę. Np. Jeśli chcesz dodać $(PLATFORM_DIR)/Developer/Library/Frameworksdo FRAMEWORK_SEARCH_PATHSSpecta:

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
źródło
Pamiętaj, że może być konieczna zmiana, "Pods-Tests-Specta"aby dopasować ustawienia projektu, lub po prostu użyj pętli zasugerowanej przez @squarefrog, aby iterować po każdym celu.
pix0r
1
Źle się wymówiłem - @squarefrog nie zasugerował pętli. Mam na myśli zamianę wierszy 2-3 w rozwiązaniu @ deanWombourne na: installer.project.targets.each do |targetaby zapętlić wszystkie cele i zastosować zmianę.
pix0r
2

Po pewnym czasie napotkałem ten sam problem, zaimportowałem framework XCTest z faz kompilacji i rozwiązałem problem.

Fazy ​​kompilacji-> XCTest.Framework> wyczyść i uruchom. Mam nadzieję, że komuś to pomoże.

w celach informacyjnych ... Importuj XCTest do istniejącego projektu

Narasimha Nallamsetty
źródło
U mnie to zadziałało, ale musiałem również przejść do ustawień docelowych dla nowych testów i na karcie Ogólne zaznaczyć pole do testowania interfejsów API aplikacji.
Fran K.
1

W chwili pisania tego tekstu najnowsza wersja Cocoapods (0.33.1) nie zawiera rozwiązania problemu.

Ale najnowocześniejsza wersja tak.

Postępuj zgodnie z tym przewodnikiem, aby ustawić najnowszą wersję Cocoapods ze źródła. Nazywam mój pod-dev(omówiony w przewodniku), aby odróżnić go od wersji strąków z klejnotem.

Zaletą tego podejścia jest to, że nie potrzebujesz dodatkowych skryptów w swoim pliku Podfile. Musisz tylko pamiętać, aby zrobić pod-dev installzamiast zwykłego pod install.

fatuhoku
źródło
1

Najlepszym sposobem na przeprowadzenie testu XCTest jest dodanie go z Nawigatora testów (piąta ikona w lewym panelu).

W ten sposób nowy xx.mplik testowy nie jest przeznaczony dla (w prawym okienku) aplikacji (w lewym okienku> Element docelowy, rozszerzenie opakowania: aplikacja), ale pakiet (rozszerzenie opakowania: xctest)

  • XCTest.framework pozostaje w Red,
  • z powodu pewnych modyfikacji możesz mieć błąd 'XCTest/XCTest.h' file not found, to dlatego, że Twój plik musiał być przeznaczony dla aplikacji.
tontonCD
źródło
0

To najłatwiejsze rozwiązanie, jakie znalazłem. Żadne zmiany w projekcie nie są konieczne. Ta zmiana będzie obowiązywać do następnej aktualizacji Xcode:

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
źródło
Wadą tego jest to, że udostępniasz swój projekt innym, ponieważ musisz zmusić ich do wykonania tej akcji, za każdym razem, gdy jest aktualizacja Xcode. Jest to problem z implementacją Cocoapods, dlatego warto go rozwiązać za pomocą Cocoapods!
squarefrog
Zgoda. A to nie jest idealne. Ale jest to naprawdę łatwe i dobrze skaluje się z liczbą posiadanych strąków (O (1)). Lepiej też ograniczyć liczbę wersji Xcode 6 :-)
Steven Kramer
Dodanie ścieżki do ścieżek wyszukiwania frameworka nie wydaje się przerywać: testy będą budować, ale nie będą działać. Najwyraźniej dlatego, że pakiet testowy nie był w stanie rozwiązać struktury XCTest.
Steven Kramer
0

W przypadku projektu bez Cocoapods (czyli nie odpowiadającego bezpośrednio na pytanie PO, ale być może pomocnego dla mnie lub innych w przyszłości) mieliśmy ten sam problem. Zostało to rozwiązane poprzez zastąpienie naszych poprzednich pozycji OCTest przez XCTest. Na przykład plik MyApp.xcodeproj / project.pbxproj ma tę różnicę (skróconą); - path = MyAppUnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + path = MyAppUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };

AnneTheAgile
źródło