31 votes

Tests unitaires en ligne de commande iPhone (et E / S sur fichier)

La courte question est: Comment puis-je obtenir de l'iPhone (objective-c) opérations sur les fichiers pour fonctionner correctement à partir d'une ligne de commande de l'Unité de Test?

Le long de la question, avec une explication: Cela finit par devenir un script pour effectuer automatisée du bâtiment/de test pour mon iPhone construire, par l'intermédiaire d'un Hudson instance. Suivant makdad de lien sur ce DONC, la question m'a permis d'exécuter des tests Unitaires à partir de la ligne de commande (semi) avec succès.

Cependant, un de mes tests échoue. Le test pourrait appeler un Service de mise en Cache de la classe pour enregistrer un fichier, puis essayer de le récupérer. cependant, les e/S de fichier semble ne pas fonctionner lors de l'exécution de tests en ligne de commande :(.

Pour Référence, l'exécution de tests Unitaires via Xcode GUI résultats dans aucune de ces erreurs.

Je suis à l'aide de NSFileHandle les appels de méthode pour obtenir des poignées pour l'écriture. si ils reviennent à zéro, le fichier est créé à l'aide de

[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];

J'ai pensé qu'il peut avoir à faire avec les espaces dans le chemin d'accès au simulateur du répertoire de cache. suis-je sur la bonne voie? si oui, comment pourrais-je y remédier?

Notez également que le simulateur doit être PAS en cours d'exécution déjà dans l'ordre pour que cela fonctionne, le simulateur est lancé par programme et n'affiche pas d'interface graphique. si elle est en cours d'exécution, la ligne de commande de l'échec de la construction.

3voto

Mats Stijlaart Points 2436

D'abord: "le simulateur doit être PAS en cours d'exécution déjà dans l'ordre pour que cela fonctionne'
J'ai mes tests en cours d'exécution dans le terminal et il n'a pas d'importance si le simulateur est sur.

Peut-être que certains paramètres de construction que vous avez à regarder sont: TEST_HOST et BUNDLE_LOADER. Je les laisse vide dans mon xcodeproj.
Note: je suis à l'aide d'Hudson ainsi qu'avec les rapports de tests et de couverture de code.

Deuxième:
J'ai connu des échecs dans les tests de terminaux et d'applications de chargement pour les chemins d'accès. C'était lié à la Base de Données du modèle qui est chargé à partir d'une ressource.
La solution est de charger le fichier à partir de l'url au lieu d'un chemin:

[[NSBundle bundleForClass:[self class]] URLForResource:....];

Je ne peux pas garantir cela concerne le même problème de votre rencontre avec le NSFileManager, mais je peux seulement imaginer que NSBundle fait usage de la NSFileManager. (Si cela peut être lié)

Troisième:
Ne faites pas de vos tests dépend de I/O.
Je trouve que ce n'est pas le but d'un Test Unitaire. Un tel test ne peut pas compter sur un système de fichiers, base de données, de connexion réseau, etc.

Faire un système de fichiers abstraction de la classe que vous vous moquez lors de l'exécution de vos tests.
De cette façon, votre application est qu'à un endroit en s'appuyant sur le système de fichiers, vous pouvez le remplacer en cours de test.

Vous avez seulement besoin d'un test pour vérifier que l'abstraction.

Résumé

  • La première permettra d'améliorer votre installation d'essai.
  • La deuxième va nous espérons résoudre votre test de problème.
  • Le troisième permettra de réduire la survenue du problème et d'améliorer votre code.

Espérons que cela a été utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X