Ich schreibe eine Komponente, die angesichts einer ZIP-Datei Folgendes benötigt:
- Entpacken Sie die Datei.
- Suchen Sie eine bestimmte DLL unter den entpackten Dateien.
- Laden Sie diese DLL durch Reflektion und rufen Sie eine Methode darauf auf.
Ich möchte diese Komponente einem Unit-Test unterziehen.
Ich bin versucht, Code zu schreiben, der sich direkt mit dem Dateisystem befasst:
void DoIt()
{
Zip.Unzip(theZipFile, "C:\\foo\\Unzipped");
System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar");
myDll.InvokeSomeSpecialMethod();
}
Aber die Leute sagen oft: "Schreiben Sie keine Komponententests, die auf dem Dateisystem, der Datenbank, dem Netzwerk usw. beruhen."
Wenn ich dies auf Unit-Test-freundliche Weise schreiben würde, würde es wahrscheinlich so 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 testbar; Ich kann der DoIt-Methode Test-Doubles (Mocks) hinzufügen. Aber zu welchen Kosten? Ich musste jetzt 3 neue Schnittstellen definieren, um dies testbar zu machen. Und was genau teste ich? Ich teste, ob meine DoIt-Funktion ordnungsgemäß mit ihren Abhängigkeiten interagiert. Es wird nicht getestet, ob die Zip-Datei ordnungsgemäß entpackt wurde usw.
Es fühlt sich nicht mehr so an, als würde ich die Funktionalität testen. Es fühlt sich an, als würde ich nur Klasseninteraktionen testen.
Meine Frage lautet : Was ist der richtige Weg, um etwas zu testen, das vom Dateisystem abhängig ist?
Bearbeiten Ich bin mit .NET, aber das Konzept könnte Java oder nativen Code beantragen.
myDll.InvokeSomeSpecialMethod();
dem Sie überprüfen würden, ob er sowohl in Erfolgs- als auch in Misserfolgssituationen korrekt funktioniert, sodass ich keinen Unit-Test durchführen würde. Dies bedeutet DoIt
jedoch DllRunner.Run
, dass ein UNIT-Test missbraucht wird, um zu überprüfen, ob der gesamte Prozess funktioniert ein akzeptabler Missbrauch und da es sich um einen Integrationstest handelt, der einen Unit-Test maskiert, müssen die normalen Unit-Test-Regeln nicht so streng angewendet werden