tests unitaires de ligne de commande iPhone (et E/S de fichier)

La question courte est: Comment puis-je faire fonctionner correctement les opérations de fichiers iPhone (objective-C) à partir d'un test unitaire en ligne de commande?

La longue question, avec explication: cela finira par devenir un script pour effectuer un bâtiment/test automatisé pour ma construction iPhone, via une instance Hudson. Suite au lien de makdad sur cette question SO 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 appellerait une classe de service de mise en cache pour enregistrer un fichier, puis essayez de le récupérer. cependant, les e / s de fichier semblent ne pas fonctionner lors de l'exécution des tests à partir de la ligne de commande :(.

Pour référence, l'exécution des tests unitaires via L'interface graphique Xcode n'entraîne pas de telles erreurs.

J'utilise des appels de méthode NSFileHandle pour obtenir des poignées pour l'écriture. s'ils renvoient nil, le fichier est créé en utilisant

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

Je pensais que cela pourrait avoir à voir avec les espaces dans le chemin d'accès au répertoire cache du simulateur. être - Je sur la bonne piste? si oui, comment pourrais-je y remédier?

Notez également que le simulateur doit être pas déjà en cours d'exécution pour que cela fonctionne, le simulateur est démarré par programme et n'affiche pas D'interface graphique. si elle est en cours d'exécution, la génération de ligne de commande échoue.

31
demandé sur Community 2011-09-27 10:49:44

1 réponses

Premièrement: 'Le simulateur ne doit pas déjà fonctionner pour que cela fonctionne'
J'ai mes tests en cours d'exécution dans le terminal et peu importe si le simulateur est activé.

Peut-être que certains paramètres de construction que vous avez à regarder sont: TEST_HOST et BUNDLE_LOADER. Je les laisse vides dans mon xcodeproj.
Note: J'utilise également Hudson avec les rapports de test et la couverture du code.

Deuxième:
J'ai connu des échecs dans les tests le terminal et l'application avec le chargement chemin. Cela était lié au modèle de données de base qui est chargé à partir d'une ressource.
La solution était de charger le fichier à partir de l'url au lieu d'un chemin:

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

Je ne peux pas m'assurer que cela concerne le même problème que votre rencontre avec le NSFileManager, mais je ne peux qu'imaginer que NSBundle utilise le NSFileManager. (Donc cela peut être lié)

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

Créez une classe d'abstraction du système de fichiers que vous vous moquez lors de l'exécution de vos tests.
De cette façon, votre implémentation est seulement à un endroit en s'appuyant sur le système de fichiers réel, que vous pouvez remplacer pendant les tests.

Vous n'avez besoin que d'un test pour vérifier cette abstraction.

Résumé

  • le premier améliorera votre configuration de test.
  • la seconde résoudra, espérons-le, votre test problème.
  • le troisième réduira l'occurrence du problème et améliorera votre code.

J'espère que cela a été utile.

3
répondu Mats Stijlaart 2011-12-20 13:22:50