2009-11-11 5 views
9

A partir d'une application déjà en développement, j'ai exécuté les instructions données dans le Guide de développement iPhone - Applications de tests unitairesLinker Erreur: iPhone Unité de référencement Bundle test cours App

Je peux comprendre avec succès et utiliser mon application de classes dans les tests de style Application qui s'exécutent sur le périphérique et transmettent leurs résultats à la console.

Si j'ajoute la ligne de code suivante:

STAssertTrue([viewController isKindOfClass:[LoginViewController class]], @"Top view controller is not LoginViewController"); 

L'erreur de compilation suivante est générée:

Undefined symbols: 
    "_OBJC_CLASS_$_LoginViewController", referenced from: 
     [email protected] in LoginViewTest.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

Je peux fournir des informations plus de configuration pour le projet et la cible d'essai, mais le Le programme d'installation fonctionne sans la ligne [LoginViewController class] dans la source de test.

Sans cette ligne, je peux référencer la classe, utiliser ses propriétés et lui envoyer des messages avec succès.

Existe-t-il un paramètre de génération de liens ou une option de chargement de groupe requis pour essayer d'utiliser une classe App de cette manière? Ou devrais-je trouver un autre type de test pour confirmer que la classe d'un objet est celle attendue?

Répondre

18

J'ai trouvé une réponse, mais je pense qu'il doit y avoir un "meilleur" moyen?

Dans la configuration de construction pour le faisceau de tests unitaires, vous pouvez spécifier le paramètre Loader Bundle (BUNDLE_LOADER) qui pointe vers votre application « hôte ».

${TARGET_BUILD_DIR}/AppName.app/AppName 

Le faisceau de tests unitaires est en cours de construction en tant que dépendance de votre cible de tests unitaires de App (par exemple, AppName Testing), et par conséquent je n'ai pas été en mesure de résoudre l'exécutable App mieux que ce qui précède.

Le résultat net est un test d'unité de travail injecté dans la cible de test sans erreurs de liaison. Les tests s'exécutent et accèdent aux classes comme prévu.

EDIT: Bundle Chargeur - Configuration cible

Il est important de configurer la cible qui est "l'hôte" du faisceau de test à pas cacher c'est des symboles.

GCC_SYMBOLS_PRIVATE_EXTERN = NO 

a.k.a. "Symboles masqués par défaut". De la documentation:

When enabled, all symbols are declared 'private extern' unless explicitly marked to be exported using '__attribute__((visibility("default")))' in code. If not enabled, all symbols are exported unless explicitly marked as 'private extern' .

For more information, see http://developer.apple.com/documentation/DeveloperTools/Conceptual/CppRuntimeEnv/Articles/SymbolVisibility.html .

+0

Cela m'a orienté dans la bonne direction, merci. Mon problème était que j'avais changé le "Nom du produit" dans la cible principale, et ainsi j'ai dû mettre à jour le "chargeur de paquet" dans la cible de test. –

+0

Excellente réponse, merci beaucoup en effet. Pas très intuitif lorsque vous configurez des tests sur un projet existant. De toute façon ça marche maintenant !! De plus, il m'a fallu un certain temps pour trouver le réglage Bundle chargeur, assurez-vous « Tous » est cochée en haut des paramètres de compilation et non « Basic » – Sam

+0

Ugh, enfin. J'ai fait la même chose et je savais ce qui se passait, mais je ne pouvais pas pour la vie de moi trouver le damné bâtiment pour le réparer. Merci beaucoup. – DougW

1

Je viens de répondre ceci ici:

iPhone unit testing: Symbols not found when calling custom code

Je suppose que l'un de ceux-ci devraient être fermés en double? Je ne suis pas assez digne de confiance pour le faire ...


I ont également suivi l'unité iPhone d'Apple Testing Applications document et a vu une erreur de liaison similaire à celle décrite dans la question lors d'une tentative de test unitaire une de mes classes.

On dirait une classe référencée dans votre classe de test unitaire et donc en cours d'exécution de votre cible de test doit également être ajouté à cette cible de test. Pour ce faire, vous devez cliquer avec le bouton droit sur votre classe RootViewController et cliquer sur "Get Info" (raccourci Cmd-i). Dans le volet des cibles, assurez-vous que votre cible de test unitaire (par exemple, 'LogicTests', si vous avez suivi la dénomination dans ce document) est cochée. Maintenant que la classe

seront compilés avec vos tests et devrait être disponible à votre test unitaire. Pour effectuer un double contrôle, développez les « objectifs/LogicTests/Ressources Compile » nœud dans le navigateur "Groupes & Fichiers de gauche. Ceci liste tous les fichiers de classe disponibles lors de la construction de la cible et devrait maintenant inclure votre classe de test unitaire avec votre classe à tester. (Notez que vous devrez sélectionner toutes les cibles appropriées lorsque vous créez une nouvelle application ou une nouvelle classe de test - sur la même page de la fenêtre 'Nouveau fichier ...' lorsque vous nommez le fichier).

(J'utilise XCode 3.2.3 & OS 4.0, par la voie).

+0

Vos notes sont généralement OK. Mais ils ne répondent pas à la question que j'ai posée. Ma question et ma réponse traitent des symboles disponibles dans le lot de tests unitaires injectés au moment de la liaison. C'est aussi l'erreur indiquée par l'autre question que vous liez. Votre réponse est une partie importante de la mise en place de la cible «test», mais dans nos deux cas cela ne posait aucun problème. – ohhorob