Datei erstellen Während Unit Test - Kann Öffnen Sie es nicht zu schreiben - TestDriven.Net und NUnit
-
10-10-2019 - |
Frage
Ich bin einige Code zu testen, dass Bedürfnisse und Fileinfo Directory Objekt und anstelle von Schreib ein Wrapper und mehrere Schnittstellen zu verwenden, um dies zu lösen, dachte ich, es ist eine gute Idee, einige Dateien erstellen sein würde, wenn Sie den Test starten und dann diejenigen löschen Dateien nach dem Test durchgeführt wird. Dies ist die Art, wie ich erstellen Sie die Dateien:
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 kein Problem. Die Dateien im Ordner und alles sieht gut aus erstellt werden
Dann, wenn die Ausführung des Tests weiter, ich versuche zu öffnen eines dieser Datei zu schreiben etwas in ihm, und ich eine Ausnahme erhalten, welche die Datei, die ich zum Schreiben geöffnet werden soll wird von anderem Prozess verwendet wurde und, nachdem er mit genauer Überprüfung, ich das TestDriven.Net Prozess als man sehen, um die Datei zu blockieren. Dies ist der Code, den ich verwende, um Schreibdaten in die Datei zu öffnen und versuchen:
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? richtig ist nicht das Datei-Handle zu veröffentlichen? gibt es einen weg das Schloss von TestDriven.Net zu stehlen? sollte ich diese Dateien anders erschaffen? sollte ich den Test auf andere Weise schreiben?
Vielen Dank im Voraus für die Antworten und Kommentare =).
EDIT:
dieses spezielle Problem lösen (das eigentliche Problem, wie Dave Swersky erwähnt, ist, dass die Einheit Test sollte das Dateisystem nicht berühren) ich den Link von James Wiseman gesendet verwendet (nochmals vielen Dank James =) und die Datei mit einem Fileshare-Flag erstellt, auf diese Weise ich in die Datei zu erreichen, öffnen sie ihm eine Schreib zu. Wie folgt aus:
using (FileStream fileStream = new FileStream( filename, FileMode.Create, FileAccess.ReadWrite, **FileShare.ReadWrite**))
Damit ich die in die Datei öffnen und schreiben kann. =)
Lösung
Ich merke, Sie verwenden das FileStream
Objekt direkt das Schreiben auszuführen.
Gibt es das gleiche Problem vorhanden, wenn Sie ein StreamWriter
Objekt und Verwendung erstellen, die für die Dateioperationen (einschließlich der Nähe)?
Eine Suche auf Google drehte diesen Artikel nach oben. Sie kann es hilfreich finden. http://foson.blogspot.com/2007/10 /closing-filestream-and-streamwriter-and.html
Andere Tipps
Dies ist wahrscheinlich nicht die Antwort, die Sie suchen, aber das ist genau, warum Sie Mocks verwenden sollten, und nicht tatsächlich Dateien erstellen.
Hier ist eine gebrauchsfertige Lösung, die das Dateisystem für spöttisch: http: //bugsquash.blogspot.com/2008/03/injectable-file-adapters.html