Je veux simplement inclure ma classe Swift 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.
J'ai eu le même problème, également dans mes fichiers XCTestCase
, mais pas dans les fichiers de projet standard.
Pour se débarrasser du:
Utilisation de l'identifiant non résolu 'PrimeNumberModel'
J'avais besoin de import
le 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.
Maintenant, vous n'avez pas besoin d'ajouter le public
aux méthodes à tester. Sur les versions plus récentes de Swift, il suffit d'ajouter le mot clé @testable
.
PrimeNumberModelTests.Swift
_import XCTest
@testable import MyProject
class PrimeNumberModelTests: XCTestCase {
let testObject = PrimeNumberModel()
}
_
Et vos méthodes internes peuvent garder Internal
PrimeNumberModel.Swift
_import Foundation
class PrimeNumberModel {
init() {
}
}
_
Notez que les symboles private
(et fileprivate
) ne sont pas disponibles, même si vous utilisez _@testable
_.
Il y a deux concepts pertinents de Swift ici (comme Xcode 6 beta 6).
Internal access
_Considérant que les tests sont sur une autre cible sur _PrimeNumberModelTests.Swift
_, vous devez import
la cible qui contient la classe que vous souhaitez tester, si votre cible est appelé MyProject
devra ajouter _import MyProject
_ à la PrimeNumberModelTests
:
PrimeNumberModelTests.Swift
_import XCTest
import MyProject
class PrimeNumberModelTests: XCTestCase {
let testObject = PrimeNumberModel()
}
_
Mais cela ne suffit pas pour tester votre classe PrimeNumberModel
, puisque le niveau de contrôle d'accès par défaut est _Internal Access
_, votre classe ne sera pas visible par le test bundle, vous devez donc le rendre _Public Access
_ et toutes les méthodes que vous souhaitez tester:
PrimeNumberModel.Swift
_import Foundation
public class PrimeNumberModel {
public init() {
}
}
_
Dans le Documentation , il est indiqué qu'il n'y a pas d'instructions d'importation dans Swift.
Utilisez simplement:
let primNumber = PrimeNumberModel()
Vérifiez l'appartenance à la cible de PrimeNumberModel.Swift dans votre cible de test.
En Objective-C, si vous voulez utiliser une classe dans un autre fichier, vous devez l'importer:
#import "SomeClass.h"
Cependant, dans Swift, vous n'avez pas du tout à importer. Utilisez-le simplement comme s'il était déjà importé.
// This is a file named SomeClass.Swift
class SomeClass : NSObject {
}
// This is a different file, named OtherClass.Swift
class OtherClass : NSObject {
let object = SomeClass()
}
Comme vous pouvez le constater, aucune importation n’était nécessaire. J'espère que cela t'aides.
Selon Apple, vous n'avez pas besoin d'importer les Swift fichiers de la même cible. Je l'ai enfin fait fonctionner en ajoutant mon fichier Swift à la fois à ma cible normale et à ma cible de test. Ensuite, j'ai utilisé l'en-tête de pontage à des fins de test pour vérifier que les fichiers ObjC que j'ai référencés dans mon en-tête de pontage normal étaient disponibles. A couru comme un charme maintenant.
import XCTest
//Optionally you can import the whole Objc Module by doing #import ModuleName
class HHASettings_Tests: XCTestCase {
override func setUp() {
let x : SettingsTableViewController = SettingsTableViewController()
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// This is an example of a functional test case.
XCTAssert(true, "Pass")
}
func testPerformanceExample() {
// This is an example of a performance test case.
self.measureBlock() {
// Put the code you want to measure the time of here.
}
}
}
SO Assurez-vous donc que PrimeNumberModel a une cible de votre cible de test. Ou la solution High6 d'importer tout votre module fonctionnera
J'ai pu résoudre ce problème en nettoyant mon build.
Menu supérieur -> Produit -> Nettoyer ou raccourci clavier: Shift+Cmd+K
À partir de Swift 2.0, la meilleure pratique est la suivante:
Ajoutez la ligne @testable import MyApp
en haut de votre fichier de test, où "MonApp" est le Nom du module de produit de votre cible d'application (visible dans votre cible d'application build paramètres). C'est ça.
(Notez que le nom du module du produit sera identique à celui de la cible de votre application, à moins que le nom de celle-ci ne contienne des espaces qui seront remplacés par des traits de soulignement. Par exemple, si ma cible d'application était appelée " Jeu amusant "J'écrirais @testable import Fun_Game
en haut de mes tests.)
Vérifiez vos paramètres PrimeNumberModelTests
Target.
Si vous ne pouvez pas voir le fichier PrimeNumberModel.Swift
dans la construction Phases/Compile Sources
, ajoutez-le.
Vous devez ajouter une routine que le compilateur doit référencer en tant que point d’entrée. Ajoutez donc un fichier main.Swift, qui dans ce cas crée simplement une instance de votre fichier de test:
main.Swift
PrimeNumberModelTests()
Puis compilez sur la ligne de commande (j'utilise El Capitan et Swift 2.2):
xcrun -sdk macosx swiftc -emit-executable -o PrimeNumberMain PrimeNumberModel.Swift PrimeNumberModelTests.Swift main.Swift
Dans ce cas, vous recevrez un avertissement: le résultat de l'initialiseur n'est pas utilisé , mais le programme est compilé et est exécutable:
./PrimeNumberMain
CAVEAT: J'ai supprimé les types d'importation XCTest et XCTestCase pour plus de simplicité.
Comme @ high6 et @ erik-p-hansen l'ont souligné dans la réponse donnée par @ high6, vous pouvez résoudre ce problème en important la cible du module contenant la classe PrimeNumberModel, qui porte 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 à Swift sur swiftcast.tv de Clayton McIlrath. Il aborde les 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 importer le 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 public le cours que vous essayez de tester, sauf si vous le souhaitez réellement.
Donc, vous devez
Dans mon cas, j’avais un fichier Swift que je souhaitais tester, et le fichier de test unitaire était également une classe Swift. Je me suis assuré que les modificateurs d'accès étaient corrects, mais la déclaration
import stMobile
(disons que stMobile est notre nom cible)
ne fonctionnait toujours pas (j'avais toujours l'erreur "Aucun module de ce type"), j'ai vérifié ma cible et son nom était bien stMobile. Alors, je suis allé à Build Settings, sous packaging, et j'ai trouvé le nom du module de produit, et pour une raison quelconque, cela s'appelait St_Mobile. J'ai donc changé mon instruction d'importation.
import St_Mobile
(qui est le Nom du module du produit), et tout a fonctionné.
Pour résumer:
Vérifiez votre nom de module de produit et utilisez la déclaration d'importation ci-dessous dans votre classe de test unitaire.
import myProductModuleName
Assurez-vous que vos modificateurs d'accès sont corrects (niveau de classe et vos méthodes).
Au lieu de requérir des importations explicites, le compilateur Swift recherche implicitement les fichiers .swiftmodule
des dépendances Swift.
Xcode peut créer des modules Swift pour vous ou vous référer au blog de railsware pour obtenir des instructions en ligne de commande pour swiftc
.