Nie można załadować podstawowego modułu dla XCTest


180

Pracuję szybko nad Xcode i domyślnie tworzy plik testowy, który odwołuje się do XCTest.

Kiedy ustawiam docelowe członkostwo w moim głównym projekcie, powoduje to błąd

Nie można załadować podstawowego modułu dla XCTest

Jeśli to docelowe członkostwo nie jest ustawione, testy działają poprawnie i wszystko działa poprawnie.

PS: Jestem nowy w szybkim i to chyba głupie pytanie (proszę, oświeć mnie)


17
Nie ma głupich pytań konik polny, tylko głupi pytający. ;-) Świetne pytanie, ponieważ każdy, kto to czyta, będzie miał ten sam problem.
Lance Kind

Odpowiedzi:


168

Główny projekt nie łączy się ze środowiskiem XCUnit. Należy utworzyć osobny cel testowy dla swojego projektu, jeśli jeszcze nie istnieje, i dodać do tego celu źródłowe pliki testowe.

  1. Wybierz projekt w Nawigatorze projektów. Spowoduje to otwarcie ustawień projektu w edytorze.
  2. Kliknij przycisk „+” u dołu kolumny z listą celów.

wprowadź opis zdjęcia tutaj

  1. Jeśli pracujesz nad szablonem projektu iOS , wybierz iOS > Test > iOS Unit Testing Bundle.

    Jeśli pracujesz nad szablonem projektu OS X , wybierz OS X > Test > OS X Unit Testing Bundle.


3
Tymczasem na iOS nazywa się pakiet iOS UITesting Bundle (użyj go do testów interfejsu użytkownika) lub pakiet iOS Unit Testing Package (dotyczy testów jednostkowych ...)
kuzdu

184

Sprawdź dokładnie, czy dany plik nie znajduje się w głównym celu, ale tylko w miejscu docelowym testu. Tylko cel testowy będzie miał tę strukturę do zaimportowania.


16
Jeśli to pomoże. Wybierz cel „Nie testuj” -> Fazy kompilacji -> Kompiluj źródła. Upewnij się, że Twój „ClassTest.swift” nie znajduje się w normalnym celu kompilacji.
Nick N

A jeśli jest w pakiecie głównym i pakiecie testowym, jak usunąć go z pakietu głównego.
James Robinson

1
Dzięki @NickN, wskazałeś dokładny problem, który miałem i który został naprawiony teraz!
Naishta

JEŻELI jest on w celu testowym, nie mogę uzyskać dostępu do żadnej z moich głównych metod testowania w moim głównym celu.
UKDataGeek

dzięki, działało to jak urok. po prostu usunięcie plików testowych działało.
Ccr

32

Właśnie dodałeś plik / klasę testów do głównego celu, a nie przez pomyłkę. Proste.

Rozwiązanie:

1) Usuń plik testowy z listy „Kompiluj źródła” w zakładce „Fazy budowania” dla głównego celu

2) Dodaj ten sam plik do „Kompiluj źródła” na karcie „Kompiluj fazy” dla celu testowego

To musi rozwiązać problem


15

Ten błąd pojawia się, gdy utworzę dynamiczny cel struktury macOS, do którego prowadzi łącze XCTest.framework(celem jest cel struktury, a nie cel testowy!).

W takim przypadku problem zostanie rozwiązany przez dodanie

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks

do projektu „Ustawienia kompilacji / Ścieżki przeszukiwania ram”.


Idealny! Dzięki!
Lance Kind

9
Lepiej: $(PLATFORM_DIR)/Developer/Library/Frameworksw przypadku, gdy masz wiele wersji Xcode zainstalowanych pod różnymi nazwami (np. Wersja i wersja beta).
rob mayoff

Dzięki @robmayoff to było właściwe rozwiązanie ;-)
Oliver Pearmain

To poprawna odpowiedź podczas budowania środowiska do testowania wsparcia.
Daniel Wood

7

Po wielu problemach i podskakiwaniu na stronach przepełnienia stosu, takich jak ten, udało mi się znaleźć jeden szczegół, który nie został wymieniony na innych stronach rozwiązywania problemów z testem jednostkowym iOS.

Jeśli Twój projekt używa CocoaPods, pamiętaj o uwzględnieniu celu testowego zagnieżdżonego w celu głównym aplikacji. Twój podfile może go nie zawierać, jeśli utworzyłeś cel testowy po uruchomieniu pod init. Twój plik pod powinien wyglądać mniej więcej tak:

target 'YourApp' do
    target 'YourAppTests' do
        inherit! :search_paths
        # Pods for testing
    end
end

Pamiętaj, aby zapisać plik pod i uruchomić pod installpo wykonaniu.

Mam nadzieję, że to pomoże!


5

To może trochę za późno, ale musisz:

Kliknij Plik> Nowy> Cel> Pakiet testów jednostkowych iOS.

A następnie dodaj tam swoje testy. To zadziałało dla mnie. Problem polegał na tym, że nie wybrałem opcji tworzenia testów jednostkowych podczas tworzenia projektu. Mam nadzieję, że to komuś pomoże.


2

Ten problem występuje dwa razy w twoim projekcie.

  1. Kiedy nie dodajesz UnitTestingBundle do swojego projektu podczas tworzenia nowego projektu.
  2. Kiedy instalujesz CocoaPods w swoim projekcie czasami nie za każdym razem.

1: Odpowiedź:

  • Idź do pliku Kliknij na Plik.

  • Następnie zobaczysz Pierwsza opcja Nowy Kliknij na to.

  • Po kliknięciu zobaczysz opcję Kliknij opcję Cel.

  • A następnie w pasku wyszukiwania Wyszukaj pakiet testowania jednostki IOS i dodaj problem został rozwiązany.

  • jeśli Kompilator nie może dać ci pozwolenia na dodanie tego, spróbuj Drugiej Metody, gdy jest podany poniżej.

2. Odpowiedz Problem CocoaPod:

  • Przejdź do produktu Kliknij na produkt.

  • Kliknij wyczyść lub naciśnij cmd + k.

  • Problem jest rozwiązany.


2

Chociaż przyjęta odpowiedź rozwiązuje ten problem przez większość czasu, istnieje jeszcze jeden sposób na znalezienie tego błędu.

Jeśli już zapewniłeś, że:

Jak wskazali @pwc @ nick-n i inni

  1. ClassTest.swiftPlik do członkostwa docelowej poprzez zapewnienie, że jest tylko dołączony do celu badania.
  2. ClassTest.swiftJest nie widoczne pod tobą głównych app docelowych> Źródła budowlanej> Źródła skompilować

Oto co jeszcze możesz sprawdzić:

w twoim .podspecspliku

Upewnij się, że source_filesnie zawiera on bezpośrednio ani pośrednio katalogu testowego.

na przykład :

s.source_files = ["Classes/**/*.{swift}", "Classes/**/*.{xib}"]
s.exclude_files = ["Classes/Exclude", "Classes/MyPodProjTests/"]

Zauważ, że Classes/**/*.{swift}obejmuje wszystko, co przesłania fakt, że katalog MyPodProjTestsmusi zostać wykluczony.

Rozwiązanie:

s.source_files = ["Classes/MyPodProj/**/*.{swift}", "Classes/**/*.{xib}"]

Uwaga: jest to skrajny przypadek i całkowicie ludzki błąd, ale pomyślałem, że warto to podkreślić.


Znakomita uwaga, wszystko zawarłem w swoim s.source_files. Dzięki!
Mauricio Chirino

1

Upewnij się, że docelowe członkostwo jest zaznaczone dla wszystkich modułów, gdy wybrana jest struktura testowa. Możesz wyświetlić opcję Docelowe członkostwo, wybierając Widok-> Narzędzia-> Pokaż inspektora plików


1

W moim przypadku testowałem prywatny kapsuła, więc w podspec było jak:

s.test_spec 'Tests' do |test_spec|
test_spec.source_files = 'Tests/*.swift' end

Ale w Podfile zapomniałem przynieść specyfikację testu jako taką:

target 'MyApp' do
use_frameworks!
pod 'CoconutLib', '~> 1.0', :testspecs => ['Tests'] end

0

Zrobiłem wszystkie powyższe, ale nadal nie miałem dostępu do metod, które chciałem przetestować. Ale zanim napisałem jakiś przypadek testowy, zbudowałem projekt raz, a potem metody były dostępne do przetestowania. Więc spróbuj i daj mi znać, czy to rozwiązało jakiś problem.


0

Miałem ten sam problem i rozwiązaniem było dla mnie:

  1. Wybierz mój schemat
  2. Edytuj schemat ...
  3. Następnie po otwarciu okna konfiguracji schematu wybierz lewą kartę o nazwie „Test”, aby zostać przekierowanym tutaj: wprowadź opis zdjęcia tutaj
  4. Jak widać, moje testy UITestów nie są tutaj dodawane, ale istnieją w moim projekcie, więc musiałem tylko nacisnąć przycisk plus i wybrać cel UITests w następujący sposób: wprowadź opis zdjęcia tutaj
  5. Następnie naciśnij przycisk „Dodaj” i zamknij widok konfiguracji
  6. Zakończ czysty projekt i spróbuj ponownie, powinien zadziałać
  7. I nie zapomnij też o tym zweryfikować: https://developer.apple.com/library/archive/qa/qa1954/_index.html

Mam nadzieję, że ta odpowiedź pomoże.

PS: ostatnia myśl w moim celu testowym w ustawieniach kompilacji musiałem sprawdzić te właściwości, które nie zostały poprawnie skonfigurowane:

DEBUG_INFORMATION_FORMAT = dwarf; 
ONLY_ACTIVE_ARCH = YES;
VALIDATE_PRODUCT = NO;

0

Tak jak wspomniano powyżej @Alfishe:

Musisz usunąć pliki testowe spod Compiler SourcesspoduBuild Phases

Jak pokazano niżej


wprowadź opis zdjęcia tutaj


1
Jeśli to zrobisz, nie możesz wykonać testów, o ile mi wiadomo
Juan Curti


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.