web-dev-qa-db-fra.com

Comment configurer un projet Swift + Objective-C pour les tests unitaires

Je trouve très difficile de savoir comment configurer des cibles de test dans Xcode 6b4. Quelqu'un peut-il m'orienter dans la bonne direction compte tenu de ce scénario.

J'ai principalement un projet Swift. Cependant, il existe des dépendances Objective-C tierces, qui sont placées dans l'en-tête de pontage de l'application. Je veux écrire des tests pour mon Swift code. Idéalement, dans Swift. Le problème que j'ai est le suivant ...

  1. Si je crée un cas de test Swift, alors le compilateur se plaint de ne pas trouver les en-têtes Objective-C dans l'en-tête de pontage de l'application.

  2. Si je crée un scénario de test Objective-C, je ne peux pas importer les classes Swift que je veux tester.

La seule chose que je puisse faire est d'écrire des cas de tests Objective-C, qui ne touchent aucun Swift. Je ne peux pas écrire "purement Swift code/tests" en raison des dépendances d'Objective-C.

Quelqu'un at-il des conseils ou a-t-il eu du succès à ce sujet? Ou est-ce l'état actuel des choses dans la Bêta 4?

34
Daniel Thorpe

Je ne sais pas si vous le recherchez toujours car Xcode 6 n'est plus en version bêta, mais vous pouvez ajouter votre fichier d'en-tête de pontage Objective-C à votre cible de test unitaire dans les paramètres cibles. Cela a résolu le problème pour moi.

Objective-C Bridging Header Xcode settings

28
Barlow Tucker

Depuis Xcode 6 Beta 4 notes de version problèmes connus:

Essai

• Les tests unitaires écrits en Objective-C ne peuvent actuellement pas importer l'en-tête des interfaces générées Swift ("$ (PRODUCT_MODULE_NAME) -Swift.h") pour les cibles d'application et ne peuvent donc pas être utilisés pour tester le code qui nécessite cet en-tête. (16931027)

• Solution: les tests unitaires pour Swift doit être écrit en Swift. Les tests unitaires écrits en Objective-C pour les cibles du framework peuvent accéder aux interfaces générées Swift en important le module de framework en utilisant '@import FrameworkName;'.

Donc, vous ne pouvez pas actuellement tester Swift code dans Objective-C.

Également à partir des notes de version:

Une limitation du système de contrôle d'accès est que les tests unitaires ne peuvent pas interagir avec les classes et les méthodes dans une application à moins qu'ils ne soient marqués publics. En effet, la cible de test unitaire ne fait pas partie du module d'application.

Chris Lattner a déclaré sur cet article sur les forums de développeurs qu'ils évaluent toujours la situation pour voir comment ils peuvent concilier les tests unitaires et les contrôles d'accès nouvellement mis en œuvre.

Donc, je m'attendrais à de nombreuses modifications des tests unitaires à la fois dans Swift en lui-même, ainsi que dans les projets qui utilisent à la fois Swift et Objective-C).

23
Cezar

Nous avons fait fonctionner cela, j'ai vu toutes les erreurs possibles en cours de route: erreurs de nom de module lors de l'obtention d'un VC du storyboard, erreurs MyType_MyType_ spécifiques aux entités coredata, et ainsi de suite, mais ce fut le pire.

L'astuce consiste à utiliser le fichier -Swift.h de la cible de génération à la place de la cible de tests, car dans la cible de tests, vous devez parfois inclure des fichiers objc mais pas Swift et objc ne reconnaîtront pas ceux-ci s'ils sont liés entre eux, mais dans la cible de construction, tout est là.

  • Tout d'abord, assurez-vous que le -Swift.h de la cible de tests n'est pas nommé de la même manière que la cible de génération.

  • Incluez dans les tests .pch ou dans chaque fichier individuel la cible -Swift from debug.

  • Laissez le compilateur savoir où se trouve ce fichier (dans les sources dérivées) en modifiant les chemins de recherche d'en-tête utilisateur avec: $ (OBJROOT) /MyProjectName.build/Debug-iphonesimulator/MyProjectTarget.build/DerivedSources Si vous n'êtes pas sûr, allez dans Finder et trouvez les noms. S'il y a des espaces dans les noms, vous devez ajouter\avant l'espace

  • Vous pouvez trouver plus d'informations sur les variables du projet ici: Comment imprimer une liste des "Paramètres de construction" dans le projet Xcode?

  • Toujours rechercher les chemins utilisateur doit être défini sur OUI

  • N'incluez pas les fichiers Swift dans la cible des tests, mais utilisez @testable

J'espère que Apple a corrigé cela dans le prochain xcode.

8
Cristi Băluță

Je suis tombé sur cette question en essayant de comprendre comment accéder au code Swift de mes projets Swift. Swift $ ===. Mon projet et mes tests ont été initialement démarrés dans Objective -Alors ils ont tous les en-têtes de pontage configurés.

Afin d'accéder aux classes Swift de mon projet, j'ai dû ajouter:

@testable import MyProjectName

En haut de mon fichier de test Swift. Après l'avoir créé pour les tests, Xcode a reconnu mon code Swift.

J'espère que cela aide quelqu'un d'autre.

5
RyanJM

J'ai fait travailler en mettant à jour "Nom d'en-tête d'interface généré par Objective-c" en "YourApplication-Swift.h"

Par défaut, les paramètres sont de générer TargetName-Swift.h, le compilateur ne génère jamais YourApplicaitonTest-Swift.h

5
Jignesh Sheth

J'ai eu ce problème et j'ai essayé de le résoudre dans les paramètres de construction de la cible de test. En changeant les chemins de recherche, en important Swift, en important des choses dans l'en-tête de pontage. Cependant, il s'est avéré être dans mon podfile. J'ai dû ajouter un link_with avec la cible de test. Comme ça:

platform :ios, '8.0'
link_with 'YourApp', 'YourAppTests'
pod 'ThePopularPod', '1.2.3', :inhibit_warnings => true
2
neoneye

Pour que Xcode 10 ait le Swift classes dans votre Obj-C test, vous devrez ajouter le générateur automatique en-tête Module-Swift.h dans le chemin de recherche utilisateur de votre cible de test.

Accédez à la cible de test> Paramètres de génération> Chemins de recherche d'en-tête et ajoutez $ CONFIGURATION_TEMP_DIR/YourProject.build/DerivedSources dedans

Pour des références supplémentaires, veuillez consulter Tests iOS fonctionnant avec Objective-C et Swift classe ensemble

0
Mike.R

Essayez de mettre le #import "xyz-Swift.h" instructions dans vos fichiers d'en-tête précompilés. De cette façon, vous avez différentes instructions d'importation pour tous vos en-têtes Obj-C, selon la cible:

MyProject-Prefix.pch (cible de l'application):

#import "MyProject-Swift.h"

MyProjectTests-Prefix.pch (cible de test):

#import "MyProjectTests-Swift.h" 
0
Goodsquirrel