J'essaie de configurer les tests unitaires pour mon projet. C'est une application Objective-C existante, à laquelle j'ai récemment ajouté une classe Swift. J'ai configuré les fichiers 'MyProject-Swift.h' et Swift Bridging (à la fois 'MyProject' et 'MyProjectTest') et je suis capable de créer et d'exécuter l'application très bien en utilisant à la fois le code Objective-C et Swift.
Cependant, je souhaite maintenant exécuter des tests unitaires sur la nouvelle classe Swift. J'ai configuré mon fichier de test et il ressemble à ce qui suit:
MySwiftClassTests.swift:
import UIKit
import XCTest
import MyProject
class MySwiftClassTests: XCTestCase {
override func setUp() {
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.
}
}
}
J'obtiens cette erreur lors de l'exécution de l'application en tant que test:
'MyProject-Swift.h' file not found
Je ne sais pas pourquoi cela se produit uniquement lorsque vous essayez d'exécuter les tests. Aucune suggestion?
la source
Réponses:
Le fichier "MyProject-Swift.h" est généré au chemin suivant:
"$(TARGET_TEMP_DIR)/../$(PROJECT_NAME).build/DerivedSources"
Je finis par l'ajouter aux chemins de recherche d'en-tête pour ma cible de test unitaire.
Aussi, comme @hyouuu l'a souligné à propos du problème connu, j'espère qu'Apple fournira une bonne solution à leur fin. Jusqu'à ce que je pense que nous devons utiliser cette solution ci-dessus.
https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html
la source
<Product Name> Tests
dans votre cible de test. Cependant, cette solution ne fonctionne pas si le nom de votre produit comporte des espaces. Voir ma réponse ci-dessous pour une solution.$(TARGET_TEMP_DIR)
n'a pas fonctionné. J'ai fini par utiliser$CONFIGURATION_TEMP_DIR/{myTargetName}.build/DerivedSources
Merci à @gagarwal pour avoir compris cela. Dans notre cas, le nom du produit a un espace, qui est réduit
$PROJECT_NAME
, donc j'ai dû le coder en dur. En outre, en utilisant$CONFIGURATION_TEMP_DIR
au lieu de$TARGET_TEMP_DIR
, vous pouvez supprimer le répertoire parent (../
) du chemin. La solution consiste donc à ajouter ce qui suit aux chemins de recherche d'en-tête de votre cible de test:Ou, si votre produit ne contient pas d'espaces:
la source
Vu dans la note de publication de Xcode 6.1, qu'il s'agit d'un problème connu ... signe ... Recherchez "-swift.h" dans la note de publication https://developer.apple.com/library/content/documentation/Xcode /Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html
Veuillez voir la solution de contournement de @ gagarwal ci-dessous qui FONCTIONNE!
la source
J'ai eu un problème similaire au vôtre, je pense; voici ma configuration.
J'avais un objet défini dans Swift:
Cette classe a ensuite été utilisée dans l'initialiseur d'un objet Objective-C:
Cela a rendu mes tests unitaires pour
Bar
ne pas compiler, car l'en-MyProject-Swift.h
tête n'est pas réel et la cible du test unitaire ne peut pas le voir. La note de publication partagée par @hyouuu est sur le point - mais je ne teste pas une classe Swift, je teste une classe Objective-C!J'ai pu résoudre ce problème en modifiant le fichier d'en-tête pour
Bar
utiliser une référence de classe avant à la place:Je puis inclus
MyProject-Swift.h
dansBar.m
, et tout fonctionnait - mes tests d'objets Objective-C écrit en Objective-C compilé correctement et continuer à l' utiliser, et je pourrais écrire de nouveaux tests pour les objets Swift à Swift.J'espère que cela t'aides!
la source
Foo
l'API de l'intérieurBar.m
.MyProject-Swift.h
dans le.m
fichier.Après avoir essayé tout ce que je pouvais trouver sur le sujet, la chose qui fonctionnait pour moi était en fait d'exécuter l'application bien qu'elle montrait toujours l'erreur `` ModuleName-Swift.h file not found ''.
Il a disparu et mon application fonctionne parfaitement. J'imagine que j'aurais dû y penser plus tôt ... L' erreur revient sans cesse , mais après avoir exécuté l'application, elle disparaît toujours. Le problème n'est donc pas vraiment résolu pour moi, mais je peux continuer à travailler sur d'autres sujets pour l'instant ...
la source
Un simple
a fait le travail pour moi.
la source
Étrangement, je voyais cette même erreur, mais uniquement lorsque je visais un appareil (pas le simulateur). Avant d'exécuter le test, je voyais le point d'exclamation rouge à côté de l'instruction d'importation pour "MyProjectNameTests-Swift.h".
Cependant, ce qui est drôle, c'est que si je continue et exécute le test de toute façon (malgré cette erreur de construction apparente), alors pendant la phase de construction qui se produit par la suite, XCode génère en fait le fichier "MyProjectNameTests-Swift.h", et le test fonctionne très bien!
Donc, du moins dans mon cas, il n'y avait évidemment pas besoin des autres solutions ici, bien que je pense qu'elles fonctionnent également.
Je dois également noter que j'ai supprimé mon répertoire DerivedData avant cela, alors peut-être que c'est une étape qui vaut également la peine d'être essayée.
la source
mySwiftClassTests
(et toutes les autres classes rapides que vous souhaitez utiliser dans objective-c) doivent être marquées@objc
:la source
Je ne pouvais pas le faire fonctionner en ajoutant ce chemin de fichier mentionné par d'autres réponses, mais j'ai réalisé que le fichier dans lequel il se plaignait n'était même pas testé. Je devais simplement le supprimer de la cible de test en utilisant la barre latérale Right Utilities.
la source
L'ajout d'un fichier .swift à cette cible résout le problème.
la source