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?

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.


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.


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.


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.


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

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


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.


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.

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

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; };

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.