2011-01-12 2 views
5

Ich teste einige Code, der FileInfo und DirectoryInfo-Objekt verwenden muss, und anstatt einen Wrapper und mehrere Schnittstellen zu schreiben, um dies zu lösen, Ich dachte, es wäre eine gute Idee, einige Dateien zu erstellen, wenn der Test gestartet wird, und diese Dateien dann zu löschen, nachdem der Test abgeschlossen ist. Dies ist die Art, wie ich die Dateien zu erstellen:Datei beim Komponententest erstellen - kann nicht zum Schreiben geöffnet werden - TestDriven.Net und NUnit

public static void CreateTestSchedules(int quantity) 
{ 
    String folder = Path.Combine(Directory.GetCurrentDirectory(), "FolderFiles"); 
    for(int quantity=10; quantity > 0; quantity--) 
    { 
     String filename = Path.GetTempFileName(); 
     using (FileStream fileStream = File.Create(Path.Combine(folder, filename))) 
     { 
      XDocument fileContent = Helper.CreateContent(filename); 
      Byte[] bytes = ASCIIEncoding.ASCII.GetBytes(fileContent.ToString()); 

      fileStream.Write(bytes, 0, bytes.Length); 
      fileStream.Flush(); 
      fileStream.Close(); 
     } 
    } 
} 

An diesem Punkt sehe ich nicht ein Problem: die Dateien in dem Ordner erstellt werden, und alles sieht gut aus.

Dann, wenn die Ausführung des Tests fortgesetzt wird, versuche ich eine dieser Dateien zu öffnen, um etwas darin zu schreiben, und ich bekomme eine Ausnahme, die die Datei, die ich zum Schreiben öffnen möchte, von anderen Prozessen verwendet wird , nachdem ich mit mehr Details überprüft habe, sehe ich den TestDriven.Net-Prozess als derjenige, der die Datei blockiert. Dies ist der Code, den ich zu öffnen und versuchen, Daten in die Datei zu schreiben:

using (FileStream file = new FileStream(filename, FileMode.Append)) 
{ 
    Byte[] bytes = ASCIIEncoding.ASCII.GetBytes(dataToWrite.ToString()); 
    if (file.CanWrite) 
    { 
     file.Write(bytes, 0, bytes.Length); 
    } 
} 

Meine Frage ist: Warum ist das passiert? gebe ich den Dateigriff nicht korrekt frei? Gibt es eine Möglichkeit, das Schloss von TestDriven.Net zu stehlen? sollte ich diese Dateien anders erstellen? Soll ich den Test auf andere Weise schreiben?

Vielen Dank im Voraus für die Antworten und Kommentare =).

EDIT:

Um lösen dieses spezielle Problem (das eigentliche Problem, wie Dave Swersky erwähnt, ist, dass die Einheit Test sollte das Dateisystem nicht berühren) habe ich den Link von James Wiseman gesendet (Danke nochmal James =) und die Datei mit einem FileShare-Flag erstellt, damit ich in die Datei greifen kann, öffne sie und schreibe darauf. Gefällt mir:

using (FileStream fileStream = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite, **FileShare.ReadWrite**)) 

Mit dem kann ich öffnen und schreiben Sie die Datei. =)

Antwort

2

Dies ist wahrscheinlich nicht die Antwort, die Sie suchen, aber das ist genau der Grund, warum Sie Mocks verwenden sollten und nicht wirklich Dateien erstellen.

Hier ist eine fertige Lösung für spöttisch das Dateisystem: http://bugsquash.blogspot.com/2008/03/injectable-file-adapters.html

+1

Danke für die Antwort/Kommentar. Der Artikel ist wirklich interessant und du hast Recht: Ich sollte das Dateisystem dafür nicht anfassen. Wie gesagt, ich dachte, ich wäre kein allzu großes Problem, weil ich sie (die Dateien) für die Dateien erstellt habe und sie dann lösche. Wenn ich das für diese Iteration nicht schnell beheben kann, denke ich, dass ich meinen Test und meinen zu testenden Code ändern muss. =) – Hugo

+0

Ich muss zugeben, dass ich den IFile-Ansatz etwas irritierend finde. Eine andere Lösung ist http://systemioabstructions.codeplex.com –

Verwandte Themen