Voici le scénario: P>
J'ai une méthode qui se lit dans un fichier via un fichier filtre et un streamreader dans .NET. Je voudrais appuyer sur cette méthode et en quelque sorte supprimer la dépendance sur l'objet StreamReader. p>
Idéalement, j'aimerais pouvoir fournir ma propre chaîne de données de test au lieu d'utiliser un fichier réel. À l'heure actuelle, la méthode utilise la méthode StreamReader.Readline. Quelle est une approche pour modifier la conception que j'ai maintenant pour que ce test soit possible? p>
4 Réponses :
dépend de Notez comment flux code> et
textreader code> à la place. Ensuite, vos tests d'unités peuvent utiliser
MemoryStream code> et
stringreader code>. (Ou charger des ressources de l'intérieur de votre appareil de test si nécessaire.) P>
readline code>
est initialement déclaré par textreader code>, pas em>
streamreader code>. P>
Mais cela ne voudrait-il que suspendre le problème? Toute classe qui utilise la "classe de lecteur" aurait alors besoin de créer le streamreader code> ou
textreader code> ou dois-je manquer quelque chose?
@Royalts: ils pourraient utiliser n'importe quel i> textreader code> et
flux code> implémentation. Dans tests, il pourrait s'agir d'un
stringreader code>; Dans le code réel, il pourrait s'agir d'un
streamreader code> d'envelopper un fichier ou d'un flux de réseau, etc. (il n'est pas clair de la question de savoir si l'OP ait vraiment besoin d'un flux code> code> et i> a
textreader code> ou juste un
textreader code>.) Mais le point est celui en déplaçant la couche d'abstraction, vous obtenez plus de flexibilité.
La solution la plus simple serait d'accepter la méthode d'accepter un flux en tant que paramètre au lieu d'ouvrir son propre filtream. Votre code actuel pourrait passer dans la FileStream comme d'habitude, tandis que votre méthode de test pourrait utiliser une filtrage différente pour les données de test, ou une mémoire de mémoire Morthstream remplie avec ce que vous vouliez tester (cela ne nécessiterait pas de fichier). P>
Sur le dessus de ma tête, je dirais que c'est une excellente occasion d'enquêter sur les mérites de Injection de dépendance . p>
Vous voudrez peut-être envisager de repenser votre méthode de manière à ce qu'il faut un délégué qui renvoie le contenu du fichier. Un délégué (la production One) peut utiliser les classes dans le système.IO, tandis que la seconde (pour tester unitaire), renvoie le contenu directement sous forme de chaîne. P>
Je pense que l'idée est de dépend de la dépendance à l'injection du textreader et de les moquer pour les tests unitaires. Je pense que vous ne pouvez que se moquer de la textreader car c'est une classe abstraite.
public class UnitTest1 { [Test] public void Test_Extract_First_Row_Mocked() { //Arrange List<TradeInfo> listExpected = new List<TradeInfo>(); var tradeInfo = new TradeInfo() { TradeId = "0453", FutureValue = 2000000, PresentValue = 3000000, NotionalValue = 400000 }; listExpected.Add(tradeInfo); var textReader = MockRepository.GenerateMock<TextReader>(); textReader.Expect(tr => tr.ReadLine()).Return("0453, 2000000, 3000000, 400000"); var fileParser = new FileParser(textReader); var list = fileParser.ProcessFile(); listExpected.ShouldAllBeEquivalentTo(list); } }