J'écris un composant qui, étant donné un fichier ZIP, doit:
- Décompressez le fichier.
- Trouvez une DLL spécifique parmi les fichiers décompressés.
- Chargez cette DLL par réflexion et invoquez une méthode dessus.
Je voudrais tester ce composant unitaire.
Je suis tenté d'écrire du code qui traite directement du système de fichiers:
void DoIt()
{
Zip.Unzip(theZipFile, "C:\\foo\\Unzipped");
System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar");
myDll.InvokeSomeSpecialMethod();
}
Mais les gens disent souvent: "N'écrivez pas de tests unitaires qui reposent sur le système de fichiers, la base de données, le réseau, etc."
Si je devais écrire ceci de manière conviviale pour les tests unitaires, je suppose que cela ressemblerait à ceci:
void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
string path = zipper.Unzip(theZipFile);
IFakeFile file = fileSystem.Open(path);
runner.Run(file);
}
Yay! Maintenant, c'est testable; Je peux alimenter en double test (mocks) la méthode DoIt. Mais à quel prix? J'ai maintenant dû définir 3 nouvelles interfaces juste pour rendre cela testable. Et qu'est-ce que je teste exactement? Je teste que ma fonction DoIt interagit correctement avec ses dépendances. Il ne teste pas que le fichier zip a été décompressé correctement, etc.
Je n'ai plus l'impression de tester la fonctionnalité. J'ai l'impression que je teste simplement les interactions de classe.
Ma question est la suivante : quelle est la bonne façon de tester unitaire quelque chose qui dépend du système de fichiers?
edit J'utilise .NET, mais le concept pourrait également appliquer du code Java ou natif.
myDll.InvokeSomeSpecialMethod();
où vous vérifieriez qu'il fonctionne correctement dans les situations de réussite et d'échec, donc je ne ferais pas de test unitaire, DoIt
mais DllRunner.Run
cela dit, une mauvaise utilisation d'un test UNIT pour vérifier que l'ensemble du processus fonctionne serait une mauvaise utilisation acceptable et comme ce serait un test d'intégration masquant un test unitaire, les règles de test unitaire normales n'ont pas besoin d'être appliquées aussi strictement