2008-12-16 6 views
4

J'ai une méthode que je veux unittest qui a des appels de système de fichiers dedans et je me demande comment y aller. J'ai regardé Unit testing code with a file system dependency mais cela ne répond pas à ma question.Méthodes de désintégration qui contiennent des appels de système de fichiers

La méthode que je suis le test ressemble à quelque chose comme ça (C#)

public void Process(string input) 
{ 
    string outputFile = "output.txt"; 
    this.Transform(input, Resources.XsltFile, outputFile); 
    if ((new FileInfo(outputFile)).Length == 0) 
    { 
     File.Delete(outputFile); 
    } 
} 

Je raille la transformation (..) méthode pour ne pas sortie quoi que ce soit dans un fichier que j'UnitTesting la méthode du processus et non la Transformez (..) la méthode et donc aucun fichier output.txt n'existe. Par conséquent, la vérification if échoue.

Comment est-ce que je devrais faire ceci correctement? Devrais-je créer une sorte de wrapper autour des méthodes du fichier io que je mockerais aussi bien?

Répondre

0

Je pense que vous devriez créer deux fichiers: un avec une longueur nulle, et l'autre avec des données. Ensuite, vous devriez avoir un test pour chaque fichier. Au cours de la phase de préparation, vous devez copier le fichier donné dans un répertoire de test, exécuter le test, et après il affirme si le fichier est présent.

5

Modifier ai-je répondu avant d'ajouter C# à la question (ou je manqué ...) Ma réponse est un peu java-esque, mais les principes sont les mêmes ...


Votre réflexion sur un wrapper autour du fichier IO est une bonne idée. Ceci est un exemple, mais quelque chose de semblable pourrait faire:

interface FileProvider { 
    public Reader getContentReader(String file); 
     // notice use of the Reader interface 
     // - real-life returns a FileReader; 
     // - testing mock returns a StringReader; 


    public FileInfo getFileInfo(String path); 
     // easy to mock out... 
} 

class Processor { 

    private FileProvider fileProvider; 

    public void setFileProvider(FileProvider provider) { 
     this.provider = provider; 
    } 

    public void process(String input) { 
     // use this.fileProvider for all filesystem operations... 
    } 
} 

Voici un exemple de dependency injection - un modèle commun pour faire des choses facilement testables:

  • Au moment de test, vous pouvez utiliser un moqueur cadre comme NMock pour simuler une mise à l'essai FileProvider;

  • Lors de l'exécution, il vous suffit de brancher l'implémentation réelle.

Questions connexes