Comment puis-je l'unité-test de l'enregistrement du fichier sur le disque?
Je sais qu'il est fortement recommandé d'exécuter l'unité-tests dans la séparation du système de fichiers, parce que si vous ne touchez système de fichier dans votre test, vous aussi test du système de fichiers lui-même. OK, c'est raisonnable.
Ma question est, si je veux tester de fichier de sauvegarde sur le disque, que dois-je faire? Comme avec la base de données, je me sépare d'une interface qui est responsable de l'accès de base de données, puis créer une autre mise en œuvre de la présente pour mes tests? Ou peut-être il ya une autre façon?
- Créer une interface pour accéder au système de fichiers. Puis créer sa maquette, soit à l'aide d'un moqueur cadre ou à la main.
- merci beaucoup pour les commentaires et les réponses, je pense que je vais rester avec les moqueries cadre
- Unité de test n'utilise pas les systèmes. Ce n'est pas les tests d'intégration. Unité de test n'est pas tester la dernière couche, qui enregistre le fichier sur le disque. Vous avez besoin de tests d'intégration pour enregistrer le fichier. Et dans ce cas, vous simple d'enregistrer et de vérifier ensuite qu'il a été créé. C'est un autre type de test, les différentes approches et différents de l'histoire. La plupart des réponses ci-dessous sont mauvais alors qu'ils discutent à propos de l'unité des tests, mais tenter de s'introduire tests d'intégration de pratiques
Vous devez vous connecter pour publier un commentaire.
Mon approche à l'égard de ce qui est fortement biaisée sur le Croissant Logiciel Orienté Objet Guidé par les Tests (GOOS), livre que je viens de lire, mais c'est le meilleur que je connaisse aujourd'hui. Plus précisément:
Mise à jour pour l'intervenant:
Si vous êtes à la lecture des données structurées (par exemple un Livre d'objets) (Si pas remplacer la chaîne de IEnumerable)
Maintenant, vous pouvez utiliser le constructeur d'injection pour injecter une maquette dans la classe client. La classe client tests unitaires sont donc rapide ; ne touche pas le système de fichiers. Ils vous suffit de vérifier que les bonnes méthodes sont appelés sur les dépendances (par exemple, Charger/Enregistrer)
Ensuite, vous devez créer le réel de la mise en œuvre de BookRepository qui fonctionne à partir d'un Fichier (ou un Sql DB tommorrow si vous le voulez). Personne n'a à savoir.
Écrire tests d'intégration pour FileBasedBookRepository (qui implémente le au-dessus de Rôle) et de tester que l'appel à la Charge avec un fichier de référence donne le droit d'objets et d'appeler Save avec une liste connue, persiste sur le disque. c'est à dire utilise de vrais fichiers Ces tests serait lente afin de les marquer avec un marqueur ou le déplacer vers un autre bureau.
Enfin, il devrait y avoir un ou plusieurs tests d'acceptation que des exercices de Chargement et de sauvegarde.
Vous pourriez au lieu de passer un nom de fichier dans votre fonction d'enregistrement, passer un Ruisseau, TextWriter ou similaire. Ensuite, lors de l'essai, vous pouvez passer d'une mémoire à base de la mise en œuvre et de vérifier la bonne octets sont écrits sans réellement écrit quoi que ce soit sur le disque.
Pour tester les problèmes et les exceptions, vous pouvez prendre un coup d'oeil à un moqueur cadre. Cela peut vous aider à le crane de générer une exception spécifique à un certain point dans le processus d'enregistrement et de tester votre code gère de manière appropriée.
invalid path
,file collision
,locked file
,invalid filename
,save interruption
etc. Je suppose que tout cela pourrait être imité ainsi.Il existe une règle générale d'être prudent et de l'écriture des tests unitaires qui ne fichier I/O, car ils ont tendance à être trop lent. Mais il n'y a pas d'interdiction absolue sur fichier I/O dans les tests unitaires.
Dans vos tests unitaires ont un répertoire temporaire mis en place et déchirés, et de créer des fichiers de test et de répertoires à l'intérieur de ce répertoire temporaire. Oui, vos tests sera plus lente que la pure tests de CPU, mais ils seront toujours être rapide. JUnit a même code de support pour les aider avec ce même scénario: un
@Rule
surTemporaryFolder
.Cela dit, la plupart d'écriture de fichier de code prend cette forme:
Seulement la première traite du système de fichiers. Le reste utilise juste un flux de sortie.
De sorte que vous pourrait en extraire le milieu et la dernière partie de sa propre méthode (fonction), qui manipule un flux de sortie, plutôt que d'un nom de fichier. Vous pouvez ensuite se moquent de ce flux de sortie de l'unité de test de la méthode. Ces tests unitaires sera très rapide. La plupart des langages de programmation déjà fournir un flux de sortie de classe.
Qui ne laisse que la première partie de l'unité testée. Vous n'aurez besoin que d'un petit nombre d'essais, de sorte que votre suite de tests doivent encore être suffisamment rapide.