Ich möchte einfach meine Swift-Klasse aus einer anderen Datei einschließen, wie z. B. den Test
PrimeNumberModel.swift
import Foundation
class PrimeNumberModel { }
PrimeNumberModelTests.swift
import XCTest
import PrimeNumberModel // gives me "No such module 'PrimeNumberModel'"
class PrimeNumberModelTests: XCTestCase {
let testObject = PrimeNumberModel() // "Use of unresolved identifier 'PrimeNumberModel'"
}
Beide Swift-Dateien befinden sich im selben Verzeichnis.
Antworten:
Ich hatte das gleiche Problem, auch in meinen
XCTestCase
Dateien, aber nicht in den regulären Projektdateien.Um das loszuwerden:
Ich brauchte
import
das Basismodul in der Testdatei. In meinem Fall heißt mein Ziel " mein Projekt" und ich habe hinzugefügtimport myproject
und die Klasse wurde erkannt.quelle
public
. Andernfalls kann dieXCTestCase
Unterklasse nicht "sehen", was Sie testen möchten. Ich habe ein paar Stunden an diesem letzten Abend verschwendet :)import
Anweisung verwendet werden sollteUPDATE Swift 2.x, 3.x, 4.x und 5.x.
Jetzt müssen Sie die
public
zu den zu testenden Methoden nicht mehr hinzufügen . In neueren Versionen von Swift muss nur das@testable
Schlüsselwort hinzugefügt werden .PrimeNumberModelTests.swift
Und Ihre internen Methoden können halten
Internal
PrimeNumberModel.swift
Beachten Sie, dass
private
(undfileprivate
) Symbole auch bei Verwendung nicht verfügbar sind@testable
.Swift 1.x.
Hier gibt es zwei relevante Konzepte von Swift (As Xcode 6 Beta 6).
Internal access
Bedenkt man, dass Prüfungen an einem anderen Ziel sind auf
PrimeNumberModelTests.swift
Sie müssenimport
das Ziel, das die Klasse enthält , die Sie testen möchten, ob Ihr Ziel genannt wirdMyProject
hinzufügen müssen ,import MyProject
um diePrimeNumberModelTests
:PrimeNumberModelTests.swift
Dies reicht jedoch nicht aus, um Ihre Klasse zu testen
PrimeNumberModel
, da die Standardzugriffssteuerungsstufe lautetInternal Access
, dass Ihre Klasse für das Testpaket nicht sichtbar ist. Daher müssen Sie siePublic Access
und alle Methoden erstellen, die Sie testen möchten:PrimeNumberModel.swift
quelle
No such module <moduleName>
in Ihrem Testfall ein Kompilierungsfehler angezeigt wird, möchten Sie möglicherweisePRODUCT_MODULE_NAME
das Testziel überprüfen . Tolle Antwort Diogo.In der Dokumentation heißt es, dass Swift keine Importanweisungen enthält.
Verwenden Sie einfach:
quelle
Überprüfen Sie die Zielmitgliedschaft von PrimeNumberModel.swift in Ihrem Testziel.
quelle
Wenn Sie in Objective-C eine Klasse in einer anderen Datei verwenden möchten, müssen Sie sie importieren:
In Swift müssen Sie jedoch überhaupt nicht importieren. Verwenden Sie es einfach so, als wäre es bereits importiert worden.
Beispiel
Wie Sie sehen, war kein Import erforderlich. Hoffe das hilft.
quelle
Laut Apple benötigen Sie keinen Import für schnelle Dateien im selben Ziel. Ich habe es endlich geschafft, indem ich meine schnelle Datei sowohl zu meinem regulären Ziel als auch zu meinem Testziel hinzugefügt habe. Dann habe ich den Bridging-Header zum Testen verwendet, um sicherzustellen, dass meine ObjC-Dateien, auf die ich in meinem regulären Bridging-Header verwiesen habe, verfügbar sind. Lief jetzt wie ein Zauber.
Stellen Sie also sicher, dass PrimeNumberModel ein Ziel Ihres Testziels hat. Oder die High6-Lösung zum Importieren Ihres gesamten Moduls funktioniert
quelle
Ich konnte dieses Problem lösen, indem ich meinen Build säuberte.
Hauptmenü -> Produkt -> Reinigen oder Tastenkombination: Shift+ Cmd+K
quelle
Ab Swift 2.0 ist die beste Vorgehensweise:
Fügen Sie die Zeile
@testable import MyApp
oben in Ihre Testdatei ein, wobei "MyApp" der Name des Produktmoduls Ihres App-Ziels ist (in den Build-Einstellungen Ihres App-Ziels sichtbar ). Das ist es.(Beachten Sie, dass das Produkt Modulnamen die gleiche wie Ihre App Ziel Name sein wird , es sei denn , Ihre Anwendung Ziel der Name Leerzeichen enthält, die mit Unterstrichen ersetzt werden. Zum Beispiel, wenn meine app Ziel genannt wurde „Fun Game“ Ich schreibe würde
@testable import Fun_Game
bei der oben auf meinen Tests.)quelle
Sie müssen eine Routine hinzufügen, auf die der Compiler als Einstiegspunkt verweisen kann. Fügen Sie daher eine main.swift-Datei hinzu, die in diesem Fall einfach eine Instanz Ihrer Testdatei erstellt:
main.swift
Dann kompilieren Sie in der Befehlszeile (ich verwende El Capitan und Swift 2.2):
In diesem Fall erhalten Sie eine Warnung: Das Ergebnis des Initialisierers wird nicht verwendet , aber das Programm wird kompiliert und ist ausführbar:
CAVEAT: Der Einfachheit halber habe ich den Importtyp XCTest und XCTestCase entfernt.
quelle
Überprüfen Sie Ihre
PrimeNumberModelTests
Zieleinstellungen.Wenn Sie die
PrimeNumberModel.swift
Datei in Build nicht sehen könnenPhases/Compile Sources
, fügen Sie sie hinzu.quelle
Also musst du
In meinem Fall hatte ich eine schnelle Datei, die ich einem Unit-Test unterziehen wollte, und die Unit-Test-Datei war auch eine schnelle Klasse. Ich habe sichergestellt, dass die Zugriffsmodifikatoren korrekt waren, aber die Anweisung
(Nehmen wir an, stMobile ist unser Zielname)
funktionierte immer noch nicht (ich bekam immer noch den Fehler "Kein solches Modul"), ich überprüfte mein Ziel und sein Name war in der Tat stMobile. Also ging ich zu Build-Einstellungen unter Verpackung und fand den Namen des Produktmoduls. Aus irgendeinem Grund hieß dieser Name St_Mobile, also änderte ich meine Importanweisung
(das ist der Name des Produktmoduls ), und alles hat funktioniert.
Um es zusammenzufassen:
Überprüfen Sie den Namen Ihres Produktmoduls und verwenden Sie die folgende Importanweisung in Ihrer Unit-Test-Klasse
Stellen Sie sicher, dass Ihre Zugriffsmodifikatoren korrekt sind (Klassenebene und Ihre Methoden).
quelle
Anstatt explizite Importe zu erfordern, sucht der Swift-Compiler implizit nach
.swiftmodule
Dateien mit Swift-Abhängigkeitsbibliotheken.Xcode kann schnelle Module für Sie erstellen oder Anweisungen zur Befehlszeile finden Sie im Railsware-Blog
swiftc
.quelle
Wie @ high6 und @ erik-p-hansen in der Antwort von @ high6 betonten, kann dies überwunden werden, indem das Ziel für das Modul importiert wird, in dem sich die PrimeNumberModel-Klasse befindet. Dies ist wahrscheinlich der gleiche Name wie Ihr Projekt in einem einfachen Projekt .
Während ich mir das ansah , stieß ich auf den Artikel Schreiben Sie Ihren ersten Unit Test in Swift auf swiftcast.tv von Clayton McIlrath. Es werden Zugriffsmodifikatoren erläutert, ein Beispiel für dasselbe Problem angezeigt (jedoch für einen ViewController anstelle einer Modelldatei) und es wird gezeigt, wie Sie das Ziel importieren und das Problem mit den Zugriffsmodifikatoren lösen, indem Sie die Zieldatei in das Ziel aufnehmen Sie müssen die Klasse, die Sie testen möchten, nicht öffentlich machen, es sei denn, Sie möchten dies tatsächlich tun.
quelle