Y a-t-il des bibliothèques ou des méthodes pour se moquer sur le système de fichiers en langage c# pour écrire des tests unitaires ? Dans mon cas j’ai des méthodes qui vérifient si certains fichier existe et lire la date de création. J’ai peut-être besoin plus que cela à l’avenir.
Réponses
Trop de publicités?Vous pourriez le faire par la création d'une interface:
interface IFileSystem {
bool FileExists(string fileName);
DateTime GetCreationDate(string fileName);
}
et la création d'un "véritable" mise en œuvre qui utilise le Système.IO.Fichier.Il existe (), etc. Vous pouvez ensuite se moquer de cette interface à l'aide d'un moqueur cadre; je recommande Moq.
Edit: quelqu'un a fait ça et gentiment posté en ligne ici.
J'ai utilisé cette approche pour se moquer de sortir DateTime.UtcNow dans un IClock interface (vraiment vraiment utile pour nos tests pour être en mesure de contrôler le flux du temps!), et plus traditionnellement, une ISqlDataAccess interface.
Une autre approche pourrait être d'utiliser TypeMock, cela vous permet d'intercepter les appels de classes et le talon. Cela ne toutefois, le coût de l'argent, et aurait besoin d'être installé sur l'ensemble de l'équipe du Pc et votre serveur de build pour exécuter la commande, aussi, apparemment, il ne fonctionnera pas pour votre Système.IO.Fichier, car il ne peut pas stub mscorlib.
Vous pourriez tout aussi bien accepter que certaines méthodes ne sont pas de l'unité de tests et de les tester dans une autre course lente intégration/tests de système suite.
Cette bibliothèque imaginaire existe maintenant, il y a un package NuGet pour System.IO.Abstractions, qui enlève à l’espace de noms System.IO.
Il y a également un ensemble de test des aides, System.IO.Abstractions.TestingHelpers qui - au moment de l’écriture - n'est que partiellement mis en œuvre, mais est un très bon point de départ.
Ma recommandation est d’utiliser http://systemwrapper.codeplex.com/ comme il fournit des wrappers pour la plupart des types utilisés dans l’espace de noms System
Je suis venu à travers les solutions suivantes:
- Écrire des tests d'Intégration, pas de tests unitaires. Pour que cela fonctionne, vous avez besoin d'un moyen simple de créer un dossier où vous pouvez vider des trucs sans se soucier d'autres tests d'intervenir. J'ai une simple Dossiertest classe qui peut créer une unique par la méthode d'essai dossier à utiliser.
- Écrire un mockable Système.IO.Fichier. C'est créer un IFile.cs. Je trouve l'utilisation de ce se retrouve souvent avec des tests qui prouvent simplement que vous pouvez écrire des moqueries des déclarations, mais ne l'utiliser lorsque le IO utilisation est faible.
- Vous examiner couche d'abstraction, et extraire le fichier IO de la classe. La création d'une interface pour cela. Le reste l'utilisation de tests d'intégration (mais ce sera très faible). Cela diffère des précédents par le fait que au lieu de faire fichier.De vous lire à écrire à l'intention, à dire ioThingie.loadSettings()
- Système.IO.Abstractions. Je n'ai pas utilisé encore, mais c'est celle dont je suis le plus heureux de jouer avec.
J'arrive à la fin à l'aide de toutes les méthodes ci-dessus, en fonction de ce que je suis en train d'écrire. Mais la plupart du temps, je me disais que l'abstraction est le problème quand j'écris des tests unitaires qui a frappé l'ei.