"Kein solches Modul" bei Verwendung von @testable in Xcode Unit-Tests

168

Ich habe kürzlich auf Xcode 7 Beta 5 aktualisiert. Ich habe versucht, einem früheren Projekt einen Komponententest hinzuzufügen, erhalte jedoch die Fehlermeldung "Kein solches Modul [myModuleName]" in der @testable import myModuleNameZeile.

Geben Sie hier die Bildbeschreibung ein

Ich habe es versucht

  • Bereinigen des Projekts mit OptionClean Build Folder
  • Überprüfen Sie, ob "Testbarkeit aktivieren" (Debug) in den Build-Optionen auf "Ja" gesetzt wurde
  • Löschen des Testziels und erneutes Hinzufügen des iOS Unit-Testpakets

Nichts davon hat für dieses Projekt funktioniert (aber ich habe Tests bekommen, um in einem anderen Projekt zu arbeiten). Hat jemand anderes dieses Problem gehabt und es gelöst?

Suragch
quelle
Wenn Sie mit xcodebuild über die Befehlszeile erstellen, müssen Sie das Flag -workspace für Ihren Build-Befehl hinzufügen. Ich habe dieses Problem auf meinem Travis Build auf diese Weise gelöst.
Victor 'Chris' Cabral

Antworten:

210

Bitte überprüfen Sie Ihren Modulnamen, mit dem Sie importieren möchten @testable import "ModuleName". Der Modulname sollte am identisch seinTarget->Build Settings-> Product Module Name

Voda Ion
quelle
5
In den meisten Fällen handelt es sich um den Namen des Produktmoduls. Überprüfen Sie spaceund_
onmyway133
5
Sei vorsichtig mit -und _. Eines meiner Projekte hat ein Minus -im Namen, aber das Modul hat _stattdessen einen Unterstrich
Beryllium
4
Ich benutzte die ""Idee und bekamExpected identifier in import declaration
Abbbood
1
@ onmyway133 war super nah. In meinem Fall hatte ich einen anderen Produktmodulnamen als meinen Projektnamen. So finden Sie Ihre Modulnamen gehen , Build SettingsIhr Projekt auswählen (nicht den Test oder UI - Test) , dann suchen Sie nach , PRODUCT_MODULE_NAMEwas auch immer zeigt dort oben ist , was nach gehen sollte@testable import
jonmecer
115

Die Antwort, die für mich funktioniert hat

Die Antwort war, dass ich einige Fehler in meinem Projekt hatte, die dazu führten, dass der Build fehlschlug. (Es war nur Ihr täglicher Standardfehler im Code.) Nachdem ich die Fehler behoben und eine weitere Bereinigung und Erstellung durchgeführt hatte, funktionierte es.

Beachten Sie, dass diese Fehler zuerst nicht angezeigt wurden. Damit sie auftauchen:

  • Kommentieren Sie Ihre gesamte Testdatei aus, die den Fehler "Kein solches Modul" anzeigt.
  • Versuchen Sie erneut, Ihr Projekt auszuführen.

Wenn andere Fehler auftreten, sollten diese jetzt angezeigt werden. Korrigieren Sie sie und kommentieren Sie den Code Ihrer Testdatei aus. Der Fehler "Kein solches Modul" war für mich verschwunden.


Falls dies das Problem für andere Personen nicht löst, können Sie auch Folgendes versuchen:

Bereinigen Sie den Build-Ordner

Öffnen Sie das Produktmenü, halten OptionSie die Maustaste gedrückt und klicken Sie auf "Build-Ordner bereinigen ...".

Geben Sie hier die Bildbeschreibung ein

Stellen Sie sicher, dass Testbarkeit aktivieren auf Ja gesetzt ist

Klicken Sie im Projektnavigator auf Ihren Projektnamen. Wählen Sie Build Settings und scrollen Sie nach unten zu Build Options. Stellen Sie sicher, dass Testbarkeit aktivieren auf Ja gesetzt ist (für das Debuggen).

Geben Sie hier die Bildbeschreibung ein

Löschen Sie Ihr Testziel und fügen Sie es erneut hinzu

Wenn Sie die anderen Dinge getan haben, ist meine Vermutung, dass Sie dies wahrscheinlich nicht tun müssen. Denken Sie in diesem Fall jedoch daran, alle bereits geschriebenen Komponententests zu speichern.

Klicken Sie im Projektnavigator auf Ihren Projektnamen. Wählen Sie dann Ihr Testziel aus. Klicken Sie unten auf das Minuszeichen (-), um es zu löschen.

Geben Sie hier die Bildbeschreibung ein

Klicken Sie dann auf das Pluszeichen (+) und wählen Sie iOS Unit Testing Bundle, um es wieder hinzuzufügen. Wie Sie sehen, können Sie auf die gleiche Weise auch ein UI-Testpaket hinzufügen.

Ein paar andere Ideen

  • Stellen Sie sicher, dass alle erforderlichen Klassen Mitglieder Ihres Testziels sind.
  • Stellen Sie sicher, dass Sie alle erforderlichen Bibliotheken hinzugefügt haben.
  • Stellen Sie sicher, dass der Modulname korrekt geschrieben ist (siehe diese Antwort ).

Oder...

Hinterlassen Sie unten einen Kommentar oder eine Antwort, wenn Sie etwas anderes gefunden haben, das funktioniert hat.

verbunden

Suragch
quelle
2
Mit Xcode 7 Beta 5 haben wir hier alle die gleichen Probleme. Leider scheinen die obigen Schritte das Problem nicht zu lösen - das Modul betrachtet es immer noch als "kein solches Modul" Dienstprogramm ". Der einzige Unterschied zu Ihren Screenshots besteht darin, dass ich versuche, dies mit dem UI-Testordner (in meinem Fall GlimpulseUITests) zum Laufen zu bringen. Funktioniert @testable möglicherweise nicht mit dem UI-Testziel?
Zac
5
*** WICHTIG *** Wenn Sie Ihr Testziel löschen und erneut hinzufügen, wird eine leere Testvorlage erstellt, die Ihre vorhandenen Tests überschreibt. Stellen Sie sicher, dass Sie Ihre Testquellen speichern, bevor Sie dies tun.
Pauln
2
Für mich wurden sogar meine einzelnen Klassen beim Tippen nicht angezeigt ... Endlich habe ich Produkt> Reinigen, XCode neu gestartet. Beim Neustart gab es einige Sekunden, um die Indizierung abzuschließen, und dann wurden alle meine Referenzen angezeigt, ohne dass jede Klasse als Mitglied des Testziels aufgenommen werden musste.
Rajive Jain
1
Wenn Sie dies nicht versucht haben, klicken Sie links auf Ihr fehlendes Framework, wählen Sie dann rechts "Zielmitgliedschaft" aus und fügen Sie es in Ihr Unit-Test-Ziel ein.
Albogdano
3
Gehen Sie zu den Einstellungen Ihres Hauptziels -> "Produktmodulname" und prüfen Sie, ob er mit dem Modulnamen übereinstimmt, den Sie in Ihrem Test importieren möchten.
f0rz
64

Das Problem für mich war, dass das iOS-Bereitstellungsziel der Tests nicht mit dem Hauptziel identisch war. Überprüfen Sie dies also unbedingt.

In Ihrem Testziel:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>
Jess
quelle
Danach tun, musste ich setzen , Enable Bitcodeum Noauf dem Test - Bundle.
Pableiros
2
Lol es funktioniert aber wie dumm von xcode, dass es keinen anderen Fehler auslöst
J. Doe
31

Auf diese Weise habe ich meinen Code zum Laufen gebracht, nachdem ich alle Lösungsvorschläge aus früheren Vorschlägen ausprobiert hatte.

  • Ich habe 'Testbarkeit aktivieren' in den Build-Einstellungen des Projekts auf 'JA' gesetzt
  • Außerdem habe ich in den Build-Einstellungen meines Projekts "Modul definieren" auf "JA" gesetzt.
  • Für die regelmäßige .swift Datei (en) in meinem Projekt, sagen MeineAnw , ich schreiben Testfälle würde für, habe ich sowohl die wichtigsten „ MyApp “ und die „ MyAppUnitTests “ Targets unter geprüft Ziel Mitgliedschaft .
  • Ich meine Unit - Test ausgewählte Datei dann (s), erklärte den ‚ @testable Import MeineAnw ‘ an der Spitze, unter dem ‚ Import XCTest ‘, und nur überprüfte die „MyAppUnitTests“ unter Ziel Mitgliedschaft

Und alles funktionierte wie Charme. Hoffe das hilft.

Vick Swift
quelle
8
Testbarkeit aktivieren und Modul definieren ist der Trick. Ich musste die Zielmitgliedschaft für reguläre * .swift-Dateien nicht ändern.
George Yacoub
Ich habe alle oben genannten Schritte ausgeführt, aber ich habe immer noch keinen solchen Modulfehler. Mein Projekt ist allerdings eine schnelle Mischung
Mikael
@Mikael, schreiben Sie Tests nur für die Swift-Dateien in Ihrer Objc / Swift-Mischungscodebasis? (Ich frage, weil ich beim letzten Überprüfen glaube, dass der '@ testable-Import' nur zum Schreiben von Testfällen für nur Swift-Dateien funktioniert hat, selbst in der Obj-c / Swift-Codebasis-Mischung. Er hat sich wahrscheinlich inzwischen geändert. Jemand hat mich korrigiert wenn ich mich hier irre).
Vick Swift
6
Ich habe mein Problem gefunden. Dies lag daran, dass die gültige Architektur meines Testziels nicht mit der Konfiguration der gültigen Architektur meines Hauptziels übereinstimmte. Jetzt gehts. Übrigens teste ich in meinem Fall nur Swift-Klassen, ich habe es nicht für Obj-c
Mikael
3
Sie sollten die schnellen Anwendungsdateien nicht zu Ihrem Testziel hinzufügen, da deren Inhalt beim Ausführen von Tests dupliziert wird.
Przemysław Wrzesiński
18

Ein Punkt, auf den Sie achten sollten, ist, dass Sie, wenn Ihr Modulname ein Bindestrichzeichen enthält, -stattdessen mit einer Unterleiste darauf verweisen müssen _. Aus irgendeinem Grund vermutete ich, dass dies ein Problem sein könnte, und es war in der Tat mein Problem.

z.B. @testable import Ocean-Swiftwird@testable import Ocean_Swift

Nur eine andere Sache: Wenn Sie die @testableSyntax verwenden, stellen Sie sicher, dass Sie Ihren Produktionscode nicht in Ihr Testziel aufnehmen. Ich habe festgestellt, dass dies unerklärliche Verrücktheit verursachen wird.

smileBot
quelle
1
Möglicherweise müssen auch alle nicht alphanumerischen Zeichen durch den Unterstrich ersetzt werden. Mein Ziel war in diesem Format App (Dev). Das testbare Modul wurdeApp__Dev_
Mushcraft
11

Dies scheint ein Fehler bei den Build-Einstellungen beider Ziele zu sein. Sie müssen sicherstellen, dass:

  • ENABLE_TESTABILITY ist für beide Ziele gleich Ja.
  • Der PRODUCT_MODULE_NAMEWert des Testziels sollte sich von dem der Anwendung unterscheiden.
Yageek
quelle
2
Das hat bei mir funktioniert. Ich habe den falschen Modulnamen verwendet. Ich habe das Leerzeichen entfernt, anstatt ein _ hinzuzufügen. DOPPELTE PRÜFEN
SIE
9

Eine andere Sache, die Sie überprüfen sollten: Wenn Sie ein Objective-C-Projekt haben, aber Unit-Tests in Swift schreiben, stellen Sie sicher, dass das Hauptziel mindestens eine Swift-Datei verwendet!


Mehr Info:

Ich arbeitete an einem Objective-C-Projekt, wollte aber Unit-Tests in Swift schreiben.

Ich habe dem Hauptziel eine Swift-Datei hinzugefügt, um die erforderliche Datei ProjectName-Bridging-Header.h zu generieren, meine Tests geschrieben und alles hat ordnungsgemäß funktioniert.

Später habe ich die Swift-Datei gelöscht, weil ich dachte, ich brauche sie nicht (der gesamte Code des Hauptziels befindet sich in Objective-C ... Ich habe nur Tests in Swift geschrieben).

Ich habe erst später ein Problem bemerkt, nachdem ich einen "Clean / Clean Build-Ordner" erstellt hatte und das Problem "Kein solches Modul" aufgetreten war. Nach einigem Kopfkratzen fügte ich eine neue leere Swift-Datei hinzu und das Problem verschwand.

Ich habe es mehrmals mit / ohne die Swift-Datei getestet und es funktioniert nur damit. Daher muss ich entweder die leere Datei im Projekt belassen, Objective-C in Swift konvertieren oder einige hinzufügen neuer Code für das in Swift geschriebene Projekt.

Jim Rhoades
quelle
1
!! Nach 3 Stunden Reinigung Löschen Abgerufene Daten, Bereinigen, 3 Mal von vorne anfangen, fand ich Ihren Kommentar, der mein Problem löste !!! Vielen Dank !!!!
Maryam Fekri
Wissen Sie, wie Sie in Swift-Testklassen auf die Objective-C-Klassen zugreifen, weil ich das Projektmodul importiere und es keinen Fehler gibt, aber meine Objective-C-Klassen immer noch nicht erkennt. soll ich noch etwas tun
Maryam Fekri
Ein zusätzlicher Punkt, den ich hinzufügen möchte, obwohl mein größtenteils ObjC-Projekt mindestens eine Swift-Datei enthält, gab es keinen Überbrückungsheader für mein Ziel. Befolgen Sie die Anweisungen unter dem folgenden Link unter der Überschrift "Code innerhalb eines App-Ziels importieren", um über Swift-Tests auf ObjC-Klassen zugreifen zu können. developer.apple.com/documentation/swift/…
palmi
9

Für diejenigen, die bis zur letzten Antwort gescrollt haben und immer noch nichts funktioniert hat, hier ist, was es für mich getan hat, nachdem ich alle anderen Antwortempfehlungen befolgt habe. Ich benutze Xcode 11:

Was das Problem in meinem Fall verursachte, war, dass ich meinen Produktnamen geändert habe

  1. Ich habe meinen Produktnamen in den Build-Einstellungen meines Hauptziels in "Neuer Name" geändert.
  2. Ich musste die Host-Anwendung für mein Testziel erneut auswählen
  3. Ich wusste nicht, dass das Ändern des Produktnamens auch den Produktmodulnamen ändern würde , der für den Modulimport in meinen Testdateien verwendet wird. Ich habe meinen Import wie folgt geändert:

    @testable import New_Name

  4. Es funktionierte

Ich hoffe, es hilft

SwissMark
quelle
7

Nachdem ich ein paar Tage mit diesen Themen verbracht habe, schaffe ich es endlich, mit meinem Projekt zu arbeiten. Das Problem lag im Bridging-Header - Der Pfad im Testziel kann nicht leer sein, wenn Sie den Bridging-Header in Ihrem Hauptziel verwendenBridging Header kann nicht leer sein !!!

Hoffe, es wird etwas Zeit für jemanden sparen.

Igor P.
quelle
5

Stellen Sie sicher, dass sich unter der Build-Einstellung des Testschemas das Testziel in der Liste befindet.

Wählen Sie neben der Wiedergabetaste das Testschema und dann Schema bearbeiten ... aus, gehen Sie zum Abschnitt Erstellen, klicken Sie auf Plus + und wählen Sie das Ziel aus, gegen das Sie testen möchten.

In meinem Fall haben wir ein internes Ziel, mit dem wir entwickeln (ein paar kleine Unterschiede), und nach einer Zusammenführung wurde es aus der Testkonfiguration entfernt.

Testschema bearbeiten

BrianHenryIE
quelle
5

Hier ist noch eine andere Sache zu überprüfen, die nicht aufgeführt ist. Für mich hatte das etwas mit meinem Team zu tun, vielleicht weil der Agent unseres Teams der neuesten Lizenzvereinbarung noch nicht zugestimmt hatte! Nachdem ich in den allgemeinen Einstellungen meines Ziels ein anderes Team ausgewählt und dann ein bestimmtes Bereitstellungsziel wie 12.1 oder 11.0 angegeben hatte, verschwand plötzlich die Warnung "Kein solches Modul".

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Dave Levy
quelle
4

In meinem Fall hatte ich 3 Probleme. Das erste war, dass ich den Importpfad angeben musste in:

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

Das zweite war, dass ich Pods verwendete und diese Pods auch in meine Tests importieren musste, indem ich:

target 'MyAppTests' do
    inherit! :complete
end

Als drittes habe ich einen Bridging-Header in meinem Ziel verwendet, daher musste ich den Bridging-Header angeben, damit er für den Test identisch ist.

el3ankaboot
quelle
2

Mein Problem war, dass die Klasse, die ich testen wollte, in einem separaten Modul (API-Client) sein sollte, aber die Klasse war tatsächlich ein Mitglied des App-Ziels und nicht des Framework-Ziels. Durch Ändern der Zielmitgliedschaft der Klasse wurde der Importfehler behoben!

Maciej Swic
quelle
2

Umgebung: Xcode Version 9.0 (9A235)
Szenario: Testen eines Open-Source-Frameworks.

Ich hatte das gleiche Problem: 'Kein solches Modul'.

Lösung:

  1. Wählen Sie das Testziel aus.
  2. Wählen Sie Build-Phasen
  3. Fügen Sie das zu testende Framework über Link Binary hinzu ...

Geben Sie hier die Bildbeschreibung ein

Hier ist die Testdatei: Geben Sie hier die Bildbeschreibung ein

Frederick C. Lee
quelle
2

Ich hatte das gleiche Problem. Das Bereinigen des Build-Ordners und das Neustarten von Xcode funktionierten nicht.

Für mich hat es funktioniert, sicherzustellen, dass die Einstellung für "Nur aktive Architektur erstellen" Ihres Testziels und Schemas mit der Einstellung des Ziels und Schemas Ihrer App übereinstimmt.

Palmi
quelle
2

Ich folgte den obigen Schritten, die funktionierten. Mein Projekt hatte jedoch einige weitere Probleme. Ich habe diese Warnung erhalten und konnte von meinem Hauptprojekt aus nicht auf Klassen zugreifen, um sie in meinem Testziel zu testen.

Testet einen Teil des Moduls - ignoriert den Import

Ich habe festgestellt, dass der Name Ihres Testziel-Produktmoduls (YourTestTarget -> Build-Einstellungen -> Suchen nach product module) nicht mit Ihrem Projektnamen identisch sein kann.

Der Name des Produktmoduls für das Testziel darf nicht mit Ihrem Projektnamen übereinstimmen

Nachdem ich den Produktmodulnamen für mein Testziel geändert hatte, funktionierte alles.

Geben Sie hier die Bildbeschreibung ein

Bryan Norden
quelle
1

Meine Lösung ist hier.

Klicken Sie zuerst auf OdeAlSwiftUITest.swift und überprüfen Sie dann Project TargetName in der Zielmitgliedschaft.

Geben Sie hier die Bildbeschreibung ein

eyup
quelle
7
Das ist falsch. Fügen Sie niemals Ihre Testdateien zu Ihrem Ziel hinzu.
smileBot
1

Geben Sie hier die Bildbeschreibung ein

Klicken Sie im Projektnavigator auf MyAppTests.swift, klicken Sie auf das rechte Feld und überprüfen Sie Ihr Modul in der Zielmitgliedschaft. Es funktioniert in meinem.

Firda Sahidi
quelle
1

Ich habe alle Antworten hier ausprobiert, aber die rote Fahne würde nicht verschwinden. Aber ich habe es zum Laufen gebracht, indem ich trotzdem einen leeren Test "ausgeführt" habe, und es hat sich geklärt.

Dinge, die ich sicherstellen möchte, sind erledigt:

  • Host-Anwendung
  • @testable import "Modulname" (stellen Sie sicher, dass der Modulname korrekt ist)
  • Stellen Sie sicher, dass Ihr Bereitstellungsziel für den Test mit dem Projekt übereinstimmt
  • XCTest muss keine Zielmitgliedschaft haben
Alexander
quelle
0

Für mich bestand die Lösung darin, @testable import myproject_ios in @testable import myproject umzubenennen, nachdem ich den Produktnamen des Ziels myproject-ios in Build-Einstellungen / Verpackung / Produktname / von $ {TARGET_NAME} in myproject aktualisiert hatte.

Matthias
quelle
0

Dies wurde für mich behoben, als ich das Bereitstellungsziel von 9.3 auf 11.0 änderte .

Allgemein> Bereitstellungsziel> "11.0"

user9226093
quelle
Dies könnte eher der Fall sein, wenn Simulatoren gewechselt werden, aber dies hat auch für mich funktioniert
RolandasR
0

Wenn Sie xcodebuild verwenden und dieses Problem feststellen, sollten Sie dem Befehl build ein Arbeitsbereich-Flag hinzufügen.

Dies wurde geändert

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

Dazu

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test
Victor 'Chris' Cabral
quelle
0

Überprüfen Sie im Testziel für Build-Einstellungen den Host-Test. Er nimmt den in PRODUCT_NAME festgelegten Namen an. Diesen Namen sollten Sie in Testklassen verwenden.

Ich empfehle, PRODUCT_NAME (Übereinstimmungsname des Hauptziels) nicht zu ändern.

Sam
quelle
-1

Wie in dieser Antwort beschrieben, habe ich einem Nur-Obj-C-Projekt Swift-Tests hinzugefügt. Die Lösung bestand darin, eine Dummy-Swift-Klasse hinzuzufügen. Danach forderte Xcode auf, einen Bridging-Header hinzuzufügen, und entfernte dann die Swift-Klasse. Danach war alles in Ordnung.

funkybro
quelle
-1

Zusätzlich zu den anderen aufgelisteten Dingen musste ich die Datei mit der Klasse, die ich testen wollte, zu meinen Kompilierungsquellen für das Unit-Test-Modul hinzufügenGeben Sie hier die Bildbeschreibung ein

Matt D.
quelle
-1

Ich denke, dies ist möglicherweise passiert, weil ich die Beispieltests gelöscht habe.

Ich entfernte das Unit-Test-Bundle und fügte es wieder hinzu, wie in den folgenden Bildern gezeigt, und alles war wieder in Ordnung.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Declan McKenna
quelle