Unit-Test-Code mit einer Dateisystemabhängigkeit

Ich Schreibe eine Komponente, die, gegeben eine ZIP-Datei, muss:

  1. Entpacken Sie die Datei.
  2. Finden, die eine bestimmte dll unter den entpackten Dateien.
  3. Laden, die dll durch Reflexion und ruft eine Methode auf.

Ich würde gern unit-test dieser Komponente.

Bin ich versucht zu schreiben code, der sich direkt mit dem Datei-system:

void DoIt()
{
   Zip.Unzip(theZipFile, "C:\\foo\\Unzipped");
   System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar");
   myDll.InvokeSomeSpecialMethod();
}

Aber Leute oft sagen, "nicht mit dem schreiben von unit-tests, die sich auf die Datei-system -, Datenbank -, Netzwerk, etc."

Wenn ich dies Schreibe, in einem unit-test, freundlichen Art und Weise, ich nehme an, es würde wie folgt Aussehen:

void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner)
{
   string path = zipper.Unzip(theZipFile);
   IFakeFile file = fileSystem.Open(path);
   runner.Run(file);
}

Yay! Jetzt ist es getestet; ich kann das Futter im test verdoppelt (mocks) zu den DoIt-Methode. Aber zu welchem Preis? Ich habe jetzt definieren mussten 3 neue Schnittstellen machen diese überprüfbar. Und was, genau, bin ich dann testen? Ich Teste gerade, dass mein DoIt-Funktion richtig interagiert mit seinen Abhängigkeiten. Es testet nicht, dass die zip-Datei war entpackt, richtig, etc.

Fühlt es sich nicht wie Teste ich die Funktionalität nicht mehr. Es fühlt sich an wie ich bin nur die Prüfung der Klasse Wechselwirkungen.

Meine Frage ist: was ist der richtige Weg, um unit-test etwas, das ist abhängig von der Datei-system?

Bearbeiten ich mit .NET, aber das Konzept konnte sich bewerben Java-oder native-code zu.

InformationsquelleAutor der Frage Judah Himango | 2008-09-24

Schreibe einen Kommentar