T1:
Vous avez trois options ici.
Option 1: Vivre avec elle.
(pas d'exemple :P)
Option 2: Créer un léger abstraction si nécessaire.
Au lieu de faire de l'e/S de fichier (Fichier.ReadAllBytes ou quoi que ce soit) dans la méthode en cours de test, vous pouvez le modifier de sorte que l'ei est fait à l'extérieur et un flux de données est transmis à la place.
public class MyClassThatOpensFiles
{
public bool IsDataValid(string filename)
{
var filebytes = File.ReadAllBytes(filename);
DoSomethingWithFile(fileBytes);
}
}
allait devenir
// File IO is done outside prior to this call, so in the level
// above the caller would open a file and pass in the stream
public class MyClassThatNoLongerOpensFiles
{
public bool IsDataValid(Stream stream) // or byte[]
{
DoSomethingWithStreamInstead(stream); // can be a memorystream in tests
}
}
Cette approche est un compromis. Tout d'abord, oui, il est plus vérifiable. Cependant, il négocie la testabilité pour un léger supplément de complexité. Ce qui peut frapper de la maintenabilité et de la quantité de code à écrire, de plus, vous pouvez simplement déplacer vos tests de problème au niveau.
Cependant, dans mon expérience, c'est une belle approche équilibrée comme vous pouvez le généraliser et de rendre testable l'important logique sans vous engager à un entièrement enveloppé de système de fichiers. I. e. vous pouvez généraliser les bits qui compte vraiment pour vous, tout en laissant le reste comme c'est.
Option 3: Enroulez le système de fichiers entier
En prenant un peu plus loin, tourner en dérision le système de fichiers peut être une approche valable; il dépend de la façon dont beaucoup de ballonnements que vous êtes prêt à vivre avec.
J'ai emprunté cette voie avant, j'avais un enroulé du système de fichiers de la mise en œuvre, mais à la fin j'ai juste supprimé. Il y avait des différences subtiles dans l'API, j'ai eu à injecter partout et finalement, c'est mal pour le peu de gain que de nombreuses classes de l'aide ce n'était pas très important pour moi. Si j'avais été en utilisant un conteneur IoC ou écrire quelque chose qui était critique, et les tests nécessaires pour être rapide je pourrais avoir coincé avec elle, si. Comme avec toutes ces options, votre kilométrage peut varier.
Comme pour votre conteneur IoC question:
Injecter votre test en double manuellement. Si vous avez à faire beaucoup de travail répétitif, il suffit d'utiliser le programme d'installation/de l'usine de méthodes dans vos tests. À l'aide d'un conteneur IoC pour le test serait exagéré à l'extrême! Peut-être que je ne suis pas la compréhension de votre deuxième question, cependant.