Je veux simplement inclure ma classe Swift à partir d'un autre fichier, comme son 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'"
}
Les deux fichiers Swift se trouvent dans le même répertoire.
Réponses:
J'ai eu le même problème, également dans mes
XCTestCase
fichiers, mais pas dans les fichiers de projet réguliers.Pour se débarrasser de:
J'avais besoin
import
du module de base dans le fichier de test. Dans mon cas, ma cible s'appelle « mon projet » et j'ai ajoutéimport myproject
et la classe a été reconnue.la source
public
. Sinon, laXCTestCase
sous - classe ne pourra pas "voir" ce que vous essayez de tester. J'ai perdu quelques heures sur cette dernière nuit :)import
déclarationMISE À JOUR Swift 2.x, 3.x, 4.x et 5.x
Vous n'avez plus besoin d'ajouter
public
les méthodes à tester. Sur les versions plus récentes de Swift, il suffit d'ajouter le@testable
mot - clé.PrimeNumberModelTests.swift
Et vos méthodes internes peuvent garder
Internal
PrimeNumberModel.swift
Notez que les symboles
private
(etfileprivate
) ne sont pas disponibles même avec l'utilisation@testable
.Swift 1.x
Il y a deux concepts pertinents de Swift ici (comme Xcode 6 beta 6).
Internal access
Étant donné que les tests sont sur une autre cible,
PrimeNumberModelTests.swift
vous avez besoin deimport
la cible qui contient la classe que vous souhaitez tester, si votre cible est appeléeMyProject
, vous devrez ajouterimport MyProject
auPrimeNumberModelTests
:PrimeNumberModelTests.swift
Mais cela ne suffit pas pour tester votre classe
PrimeNumberModel
, puisque le niveau de contrôle d'accès par défaut estInternal Access
, votre classe ne sera pas visible pour le bundle de test, vous devez donc le créerPublic Access
et toutes les méthodes que vous souhaitez tester:PrimeNumberModel.swift
la source
No such module <moduleName>
erreur de compilation dans votre scénario de test, vous pouvez vérifier laPRODUCT_MODULE_NAME
pour la cible de test. Grande réponse Diogo.Dans la documentation, il est indiqué qu'il n'y a pas d'instructions d'importation dans Swift.
Utilisez simplement:
la source
Vérifiez l'appartenance à la cible de PrimeNumberModel.swift dans votre cible de test.
la source
En Objective-C, si vous vouliez utiliser une classe dans un autre fichier, vous deviez l'importer:
Cependant, dans Swift, vous n'avez pas du tout besoin d'importer. Utilisez-le simplement comme s'il était déjà importé.
Exemple
Comme vous pouvez le voir, aucune importation n'était nécessaire. J'espère que cela t'aides.
la source
Selon Apple, vous n'avez pas besoin d'une importation pour les fichiers rapides dans la même cible. Je l'ai finalement fait fonctionner en ajoutant mon fichier swift à ma cible habituelle et à ma cible de test. Ensuite, j'ai utilisé l'en-tête de pontage pour le test pour m'assurer que mes fichiers ObjC que j'ai référencés dans mon en-tête de pontage régulier étaient disponibles. Ran comme un charme maintenant.
Assurez-vous donc que PrimeNumberModel a une cible de votre cible de test. Ou la solution High6 d'importation de votre module entier fonctionnera
la source
J'ai pu résoudre ce problème en nettoyant ma version.
Menu supérieur -> Produit -> Raccourci clavier Nettoyer ou: Shift+ Cmd+K
la source
Depuis Swift 2.0, les meilleures pratiques sont:
Ajoutez la ligne
@testable import MyApp
en haut de votre fichier de tests, où "MyApp" est le nom du module de produit de votre cible d'application (visible dans les paramètres de construction de votre cible d'application ). C'est tout.(Notez que le nom du module de produit sera le même que le nom de votre cible d'application, sauf si le nom de votre cible d'application contient des espaces, qui seront remplacés par des traits de soulignement. Par exemple, si ma cible d'application s'appelait "Fun Game", j'écrirais
@testable import Fun_Game
à la haut de mes tests.)la source
Vous devez ajouter une routine pour que le compilateur fasse référence en tant que point d'entrée, alors ajoutez un fichier main.swift, qui dans ce cas crée simplement une instance de votre fichier de test:
main.swift
Ensuite, compilez sur la ligne de commande (j'utilise El Capitan et Swift 2.2):
Dans ce cas, vous obtiendrez un avertissement: le résultat de l'initialiseur n'est pas utilisé , mais le programme se compile et est exécutable:
CAVEAT: J'ai supprimé le type d'importation XCTest et XCTestCase pour plus de simplicité.
la source
Vérifiez vos
PrimeNumberModelTests
paramètres de cible.Si vous ne voyez pas le
PrimeNumberModel.swift
fichier dans BuildPhases/Compile Sources
, ajoutez-le.la source
Donc, vous devez
Dans mon cas, j'avais un fichier rapide que je voulais tester unitaire, et le fichier de test unitaire était également une classe rapide. Je me suis assuré que les modificateurs d'accès étaient corrects, mais la déclaration
(disons que stMobile est notre nom cible)
ne fonctionnait toujours pas (j'obtenais toujours l'erreur «No such module»), j'ai vérifié ma cible, et son nom était en effet stMobile. Donc, je suis allé dans les paramètres de construction, sous l'emballage, et j'ai trouvé le nom du module de produit, et pour une raison quelconque, cela s'appelait St_Mobile, j'ai donc changé ma déclaration d'importation
(qui est le nom du module de produit ), et tout a fonctionné.
Pour résumer:
Vérifiez le nom de votre module de produit et utilisez l'instruction d'importation ci-dessous dans votre classe de test unitaire
Assurez-vous que vos modificateurs d'accès sont corrects (niveau de classe et vos méthodes).
la source
Au lieu d'exiger des importations explicites, le compilateur Swift recherche implicitement les
.swiftmodule
fichiers des bibliothèques Swift de dépendance.Xcode peut créer des modules Swift pour vous, ou consultez le blog railsware pour obtenir des instructions en ligne de commande pour
swiftc
.la source
Comme @ high6 et @ erik-p-hansen l'ont souligné dans la réponse donnée par @ high6, cela peut être surmonté en important la cible du module où se trouve la classe PrimeNumberModel, qui est probablement le même nom que votre projet dans un projet simple .
En regardant cela, je suis tombé sur l'article Écrivez votre premier test unitaire en Swift sur swiftcast.tv par Clayton McIlrath. Il traite des modificateurs d'accès, montre un exemple du même problème que vous rencontrez (mais pour un ViewController plutôt qu'un fichier de modèle) et montre comment à la fois importer la cible et résoudre le problème du modificateur d'accès en incluant le fichier de destination dans la cible, ce qui signifie vous n'êtes pas obligé de rendre publique la classe que vous essayez de tester, sauf si vous le souhaitez réellement.
la source