„Nie ma takiego modułu” w przypadku używania @testable w testach Xcode Unit


168

Niedawno zaktualizowałem do Xcode 7 beta 5. Próbowałem dodać test jednostkowy do wcześniejszego projektu, ale w @testable import myModuleNamelinii pojawia się komunikat o błędzie „Nie ma takiego modułu [nazwa_modułu]” .

wprowadź opis obrazu tutaj

próbowałem

  • czyszczenie projektu za pomocą OptionClean Build Folder
  • zaznaczenie, że opcja „Włącz testowalność” (debugowanie) została ustawiona na Tak w opcjach kompilacji
  • usunięcie celu testów, a następnie ponowne dodanie pakietu testów jednostkowych iOS

Nic z tego nie działało w tym projekcie (ale dostałem testy do pracy w innym projekcie). Czy ktoś inny miał ten problem i go rozwiązał?



Jeśli budujesz z wiersza poleceń za pomocą xcodebuild, pamiętaj o dodaniu flagi -workspace dla polecenia kompilacji. W ten sposób rozwiązałem ten problem w mojej kompilacji Travis.
Victor 'Chris' Cabral

Odpowiedzi:


210

Sprawdź nazwę modułu, z którym próbujesz importować @testable import "ModuleName". Nazwa modułu powinna być taka sama naTarget->Build Settings-> Product Module Name


5
W większości dotyczy to nazwy modułu produktu. Sprawdź spacei_
onmyway133

5
uważaj na -i _. Jeden z moich projektów ma -w nazwie minus , ale moduł ma _zamiast tego podkreślenie
beryllium.

4
Skorzystałem z ""pomysłu i dotarłem doExpected identifier in import declaration
opactwa

1
@ onmyway133 był bardzo blisko. W moim przypadku miałem inną nazwę modułu produktu niż nazwa mojego projektu. Aby znaleźć nazwę modułu przejść do Build Settingswyboru projektu (nie testowe lub testy UI), a następnie szukać PRODUCT_MODULE_NAMEjakichkolwiek pojawia się tam, co powinno iść po@testable import
jonmecer

115

Odpowiedź, która mi pomogła

Odpowiedź była taka, że ​​miałem kilka błędów w projekcie, które powodowały niepowodzenie kompilacji. (To był zwykły błąd występujący codziennie w kodzie). Po naprawieniu błędów i ponownym wyczyszczeniu i skompilowaniu, wszystko zadziałało.

Zauważ, że te błędy nie pojawiły się na początku. Aby się pojawiły:

  • Zakomentuj cały plik testowy, który powoduje błąd „Nie ma takiego modułu”.
  • Spróbuj ponownie uruchomić projekt.

Jeśli są inne błędy, powinny się teraz pojawić. Napraw je, a następnie odkomentuj kod pliku testowego. Zniknął błąd „Nie ma takiego modułu”.


Jeśli to nie rozwiąże problemu dla innych osób, możesz również spróbować następujących rozwiązań:

Wyczyść folder kompilacji

Otwórz menu Produkt, przytrzymaj Optioni kliknij „Wyczyść folder kompilacji ...”

wprowadź opis obrazu tutaj

Upewnij się, że opcja Włącz testowalność jest ustawiona na Tak

W Nawigatorze projektu kliknij nazwę swojego projektu. Wybierz opcję Build Settings i przewiń w dół do opcji Build Options. Upewnij się, że Włącz testowalność jest tak (do debugowania).

wprowadź opis obrazu tutaj

Usuń i ponownie dodaj cel testów

Jeśli zrobiłeś inne rzeczy, przypuszczam, że prawdopodobnie nie musisz tego robić. Ale jeśli to zrobisz, pamiętaj, aby zapisać wszystkie testy jednostkowe, które już napisałeś.

Kliknij nazwę projektu w Nawigatorze projektu. Następnie wybierz cel testów. Kliknij przycisk minus (-) u dołu, aby go usunąć.

wprowadź opis obrazu tutaj

Następnie kliknij przycisk plus (+) i wybierz pakiet testów jednostkowych iOS, aby dodać go ponownie. Jak widać, w ten sam sposób możesz dodać pakiet testowania interfejsu użytkownika.

Kilka innych pomysłów

  • Upewnij się, że wszystkie wymagane klasy są elementami docelowymi testu.
  • Upewnij się, że dodałeś wszystkie wymagane biblioteki.
  • Upewnij się, że nazwa modułu jest zapisana poprawnie (zobacz tę odpowiedź ).

Lub...

Zostaw komentarz lub odpowiedź poniżej, jeśli znalazłeś coś innego, co zadziałało.

Związane z


2
Mając tutaj wszystkie te same problemy, z Xcode 7 beta 5. Niestety powyższe kroki nie wydają się ich rozwiązać - moduł nadal uważa, że ​​„nie ma takiego modułu 'Utility'”. Jedyną różnicą w stosunku do zrzutów ekranu jest to, że próbuję to uruchomić z folderem testów interfejsu użytkownika (w moim przypadku GlimpulseUITests). Czy @testable może nie działa z celem testu interfejsu użytkownika?
Zac

5
*** WAŻNE *** Jeśli usuniesz i ponownie dodasz cel testu, odtworzy on pusty szablon testu, nadpisując istniejące testy. Zanim to zrobisz, zapisz źródła testowe.
pauln

2
Dla mnie nawet moje indywidualne klasy nie były wyświetlane podczas pisania ... W końcu zrobiłem Produkt> Wyczyść, ponownie uruchomiłem XCode. Po ponownym uruchomieniu dałem mu kilka sekund na zakończenie indeksowania, a następnie voila, wszystkie moje odwołania pokazały się bez konieczności dołączania każdej klasy jako elementu docelowego testu.
Rajive Jain

1
Jeśli jeszcze tego nie próbowałeś, kliknij brakujący framework po lewej stronie, a następnie po prawej wybierz „Członkostwo docelowe” i dołącz je do celu testu jednostkowego.
albogdano

3
Przejdź do ustawień kompilacji głównego celu -> „Nazwa modułu produktu” i sprawdź, czy pasuje do nazwy modułu, którą próbujesz zaimportować w teście.
f0rz

64

Problem dla mnie polegał na tym, że cel wdrożenia iOS w testach nie był taki sam jak główny cel. Więc koniecznie sprawdź to.

W Twoim celu testowym:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>

Po wykonaniu powyższych czynności, musiałem ustawić Enable Bitcodesię Nona wiązce testów.
pableiros

2
Lol to działa, ale jak głupie z xcode, że nie rzuca innego błędu
J. Doe

31

W ten sposób zacząłem uruchamiać kod po wypróbowaniu wszystkich sugerowanych rozwiązań z wcześniejszych sugestii.

  • Ustawiłem opcję „Włącz testowalność” na „TAK” w ustawieniach kompilacji projektu
  • Ustawiłem również opcję „Definiuje moduł” na „TAK” w ustawieniach kompilacji projektu.
  • Dla zwykłego pliku (ów) .swift w moim projekcie, powiedzmy MojaApl , miałem zamiar napisać do przypadków testowych, mam zarówno główny „ MojaApl ” i „ MyAppUnitTests ” Targets sprawdzane pod docelowy Członkostwa .
  • Następnie wybrałem moje pliki testów jednostkowych, zadeklarowałem „ @testable import MyApp ” u góry, pod „ import XCTest ” i zaznaczyłem tylko „MyAppUnitTests” w obszarze Członkostwo docelowe

I wszystko działało jak urok. Mam nadzieję że to pomoże.


8
Włącz testowalność i definiuje moduł, co załatwiło sprawę. Nie musiałem zmieniać członkostwa docelowego dla zwykłych plików * .swift.
George Yacoub

Wykonałem wszystkie powyższe kroki ale nadal nie mam takiego błędu modułu. mój projekt to jednak szybki miks tematyczny
Mikael

@Mikael, czy piszesz testy tylko dla plików Swift w bazie kodu mieszanki Objc / Swift? (Pytam, ponieważ ostatnim razem, gdy sprawdzałem, myślę, że „import @testable” działał tylko przy pisaniu przypadków testowych tylko dla plików Swift, nawet w mieszaninie baz kodu Obj-c / Swift. Prawdopodobnie już się to zmieniło. Ktoś mnie poprawił jeśli się mylę).
Vick Swift

6
Znalazłem swój problem. Było tak, ponieważ poprawna architektura mojego celu testowego nie była taka sama, jak konfiguracja poprawnej architektury mojego głównego celu. Teraz działa. Przy okazji, w moim przypadku testuję tylko klasy Swift, nie wypróbowałem tego dla Obj-c
Mikael

3
Nie należy dodawać plików SWIFT aplikacji do celu testowego, ponieważ podczas wykonywania testów ich zawartość zostanie zduplikowana.
Przemysław Wrzesiński,

18

Jedną z rzeczy, na które należy zwrócić uwagę, jest to, że jeśli nazwa modułu zawiera znak myślnika, -zamiast tego będziesz musiał odnieść się do niego za pomocą podkreślenia _. Z jakiegoś powodu podejrzewałem, że to może być problem i rzeczywiście był to mój problem.

na przykład. @testable import Ocean-Swiftstaje się@testable import Ocean_Swift

Jeszcze jedno, jeśli używasz @testableskładni, pamiętaj, aby nie uwzględniać kodu produkcyjnego w celu testowym. Przekonałem się, że spowoduje to niewytłumaczalną dziwność.


1
wszystkie znaki niealfanumeryczne mogą również wymagać zastąpienia podkreśleniem. Mój cel był w tym formacie. App (Dev)App__Dev_
Testowalny

11

Brzmi to jak błąd w ustawieniach kompilacji obu celów. Musisz upewnić się, że:

  • ENABLE_TESTABILITY równa się Tak dla obu celów.
  • PRODUCT_MODULE_NAMEWartość docelową testowej powinna się różnić od aplikacji.

2
To zadziałało dla mnie. Użyłem złej nazwy modułu. Usunąłem spację zamiast dodawać _.
PODWÓJNIE SPRAWDZIĆ

9

Jeszcze jedna rzecz do sprawdzenia: jeśli masz projekt Objective-C, ale piszesz testy jednostkowe w języku Swift, upewnij się, że główny cel używa co najmniej jednego pliku Swift!


Więcej informacji:

Pracowałem nad projektem Objective-C, ale chciałem napisać testy jednostkowe w języku Swift.

Dodałem plik Swift do głównego celu, aby wygenerować niezbędny plik ProjectName-Bridging-Header.h, napisałem moje testy i wszystko działało poprawnie.

Później usunąłem plik Swift, ponieważ myślałem, że go nie potrzebuję (cały kod głównego celu jest w Objective-C ... pisałem tylko testy w języku Swift).

Problem pojawił się dopiero później, kiedy wykonałem „czysty / czysty folder kompilacji” i pojawił się problem „No Such Module”. Po pewnym zarysowaniu głowy dodałem nowy pusty plik Swift i problem zniknął.

Testowałem to wiele razy z / bez pliku Swift i działa tylko z nim ... więc albo będę musiał zostawić pusty plik w projekcie, przekonwertować część Objective-C na Swift lub dodać trochę nowy kod do projektu napisanego w języku Swift.


1
!! po 3 godzinach czyszczenia usuwanie suszonych danych, czyszczenie, zaczynając od zera 3 razy, znalazłem Twój komentarz, który rozwiązał mój problem !!! Dzięki !!!!
Maryam Fekri

Czy wiesz, jak uzyskać dostęp do klas Objective-C w klasach testowych Swift, ponieważ importuję moduł projektu i nie ma w tym żadnego błędu, ale nadal nie rozpoznaje moich klas Objective-C. powinienem zrobić coś innego?
Maryam Fekri

Jeszcze jedna kwestia, którą chciałbym dodać, chociaż mój głównie projekt ObjC ma co najmniej jeden plik Swift, nie było nagłówka mostkującego dla mojego celu. Postępując zgodnie z instrukcjami pod poniższym łączem pod nagłówkiem „Importuj kod w ramach celu aplikacji” rozwiązano możliwość uzyskania dostępu do klas ObjC z testów Swift. developer.apple.com/documentation/swift/…
palmi

Natknąłem się na ten problem. Jednak jestem zainteresowany znalezieniem sposobu na uniknięcie włączania pliku Swift, jeśli to możliwe, więc zadałem pytanie tutaj: stackoverflow.com/q/62965954/211292
ThomasW

Właściwie wydaje się, że jeśli nie uwzględnisz @testable import Foowiersza, testy jednostkowe powinny działać poprawnie.
ThomasW

9

Dla tych, którzy przewinęli się do ostatniej odpowiedzi i nadal nic nie działało, oto co zrobiłem dla mnie po wykonaniu wszystkich innych porad dotyczących odpowiedzi. Używam Xcode 11:

Przyczyną problemu w moim przypadku była zmiana nazwy produktu

  1. Zmieniłem nazwę produktu w ustawieniach kompilacji głównego celu na „Nowa nazwa”
  2. Musiałem ponownie wybrać aplikację hosta jako cel testowy
  3. Nie wiedziałem, że zmiana nazwy produktu spowoduje również zmianę nazwy modułu produktu , czyli tej używanej do importu modułu w moich plikach testowych. Zmieniłem import w następujący sposób:

    @testable import New_Name

  4. Zadziałało

Mam nadzieję, że to pomoże


7

Po kilku dniach spędzonych nad tą kwestią w końcu zaczynam pracować nad swoim projektem. Problem był w nagłówku mostkowania - ścieżka w celu testów nie może być pusta, jeśli używasz nagłówka mostkowania w głównym celuNagłówek pomostowy nie może być pusty !!!

Mam nadzieję, że komuś zaoszczędzi to trochę czasu.


5

Upewnij się, że w ustawieniach kompilacji schematu testowego cel testu znajduje się na liście.

Obok przycisku odtwarzania wybierz schemat testowy, a następnie Edytuj schemat ..., przejdź do sekcji Budowa, kliknij plus + i wybierz cel, z którym chcesz przetestować.

W moim przypadku mamy wewnętrzny cel, z którym rozwijamy się (kilka drobnych różnic) i po scaleniu został on usunięty z konfiguracji testowej.

Edytuj schemat testu


5

Oto kolejna rzecz do sprawdzenia, której nie ma na liście. Dla mnie miało to coś wspólnego z moim zespołem, być może dlatego, że Agent naszego zespołu nie zgodził się jeszcze na najnowszą Umowę licencyjną! Gdy wybrałem inny zespół w ustawieniach ogólnych mojego celu, ORAZ określiłem konkretny cel wdrożenia, taki jak 12.1 lub 11.0, nagle ostrzeżenie „Brak takiego modułu” zniknęło.

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj


4

W moim przypadku miałem 3 problemy. Po pierwsze, musiałem określić ścieżkę importu w:

Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths

Po drugie, używałem Pods i musiałem zaimportować te strąki do moich testów, używając:

target 'MyAppTests' do
    inherit! :complete
end

Trzeci, ponieważ użyłem nagłówka mostkującego w moim celu, dlatego musiałem określić nagłówek mostkujący, aby był taki sam dla testu.


2

Mój problem polegał na tym, że klasa, którą chciałem przetestować, miała znajdować się w oddzielnym module (kliencie API), ale klasa była w rzeczywistości elementem docelowym aplikacji, a nie celem struktury. Zmiana docelowego członkostwa klasy spowodowała, że ​​błąd importu zniknął!


2

Środowisko: Scenariusz Xcode w wersji 9.0 (9A235)
: testowanie frameworka open source.

Miałem ten sam problem: „Nie ma takiego modułu”.

Rozwiązanie:

  1. Wybierz cel testowy.
  2. Wybierz fazy budowy
  3. Dodaj framework do przetestowania za pomocą Link Binary ...

wprowadź opis obrazu tutaj

Oto plik testowy: wprowadź opis obrazu tutaj


2

Miałem ten sam problem. Czyszczenie folderu kompilacji i ponowne uruchamianie Xcode nie zadziałało.

Pomogło mi upewnienie się, że ustawienie „Buduj tylko aktywną architekturę” celu i schematu testu jest zgodne z ustawieniem celu i schematu aplikacji.


2

Wykonałem powyższe kroki, które zadziałały. Jednak mój projekt miał więcej problemów. Otrzymałem to ostrzeżenie i nie mogłem uzyskać dostępu do klas z mojego głównego projektu w celu przetestowania w moim celu testowym.

Część testowa modułu - ignorowanie importu

Zauważyłem, że nazwa modułu produktu docelowego testu (YourTestTarget -> Build Settings -> search for product module) nie może być taka sama jak nazwa projektu.

Nazwa modułu produktu dla celu testowego nie może być taka sama jak nazwa projektu

Po zmianie nazwy modułu produktu dla celu testowego wszystko działało.

wprowadź opis obrazu tutaj


1

Wypróbowałem wszystkie odpowiedzi tutaj, ale czerwona flaga nie zniknęła. Ale udało mi się to po prostu „uruchomić” pusty test i wszystko się wyjaśniło.

Rzeczy, które chciałbym mieć pewność, że zostały wykonane:

  • Aplikacja hosta
  • @testable import „Module_name” (upewnij się, że nazwa modułu jest poprawna)
  • Upewnij się, że cel wdrożenia dla testu jest taki sam jak projekt
  • XCTest nie musi mieć członkostwa Target

0

Dla mnie rozwiązaniem była zmiana nazwy @testable import myproject_ios na @testable import myproject po zaktualizowaniu nazwy produktu docelowego myproject-ios w Ustawieniach kompilacji / Opakowanie / Nazwa produktu / z $ {TARGET_NAME} na mój projekt.


0

Zostało to naprawione, kiedy zmieniłem cel wdrożenia z 9,3 na 11,0.

Ogólne> Cel wdrożenia> „11.0”


może to być bardziej przypadek zmiany symulatorów, ale to zadziałało również dla mnie
RolandasR

0

Moje rozwiązanie jest tutaj.

Najpierw kliknij OdeAlSwiftUITest.swift, a następnie sprawdź Project TargetName w docelowym członkostwie.

wprowadź opis obrazu tutaj


8
To jest źle. Nigdy nie dodawaj plików testowych do celu.
smileBot

0

Jeśli używasz xcodebuild i znajdziesz ten problem, rozważ dodanie flagi obszaru roboczego do polecenia budowania.

Zmieniono to

$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test

Do tego

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test

0

W celu testowym ustawień kompilacji sprawdź testowanie hosta, przyjmuje nazwę ustawioną w PRODUCT_NAME. Jest to nazwa, której powinieneś używać w klasach testowych.

Nie radzę zmieniać PRODUCT_NAME (dopasuj nazwę głównego celu)


0

wprowadź opis obrazu tutaj

Kliknij MyAppTests.swift w nawigatorze projektu i kliknij prawy panel, sprawdź swój moduł w docelowym członkostwie. W moim działa.


Nie możesz dodawać klas testowych do celu aplikacji.
Alex Motor


-1

Jak opisano w tej odpowiedzi , dodawałem testy Swift do projektu opartego wyłącznie na Obj-C. Rozwiązaniem było dodanie fikcyjnej klasy Swift, po czym Xcode monitowałby o dodanie nagłówka mostkującego, a następnie usunięcie klasy Swift. Potem wszystko było w porządku.


-1

Oprócz innych wymienionych rzeczy musiałem dodać plik z klasą, którą próbowałem przetestować, do moich źródeł kompilacji dla modułu testów jednostkowychwprowadź opis obrazu tutaj


-1

Myślę, że mogło się to stać, ponieważ usunąłem przykładowe testy.

Usunąłem pakiet testów jednostkowych, a następnie dodałem go ponownie, jak pokazano na poniższych zdjęciach i wszystko było dobrze.

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

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.