PHPUnit: Wie kann ich verspotte dieses Dateisystem?
Betrachten Sie das folgende Szenario (das ist kein Produktionscode):
class MyClass {
public function myMethod() {
//create a directory
$path = sys_get_temp_dir() . '/' . md5(rand());
if(!mkdir($path)) {
throw new Exception("mkdir() failed.");
}
//create a file in that folder
$myFile = fopen("$path/myFile.txt", "w");
if(!$myFile) {
throw new Exception("Cannot open file handle.");
}
}
}
Recht, so was ist das problem? Code-coverage-reports, dass diese Zeile nicht abgedeckt ist:
throw new Exception("Cannot open file handle.");
Korrekt ist, aber da bin ich erstellen, die Ordner oben logisch es scheint unmöglich für die fopen()
zu scheitern (außer vielleicht in extremen Situationen, wie der Datenträger auf 100 %).
Konnte ich ignorieren Sie den code aus der code-coverage, aber das ist die Art von Betrug. Gibt es eine Möglichkeit, kann ich verspotte die Datei-system, so dass es erkennen kann myFile.txt
- und mock-Dateisystem nicht in der Lage, die Datei zu erzeugen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
vfsStream
ist einstream wrapper
für einevirtual filesystem
, das nützlich ist, in unit-tests zum simulieren der realen Dateisystem. Können Sie es von Komponist.Mehr Info unter:
https://github.com/mikey179/vfsStream
https://phpunit.de/manual/current/en/test-doubles.html
Mocking the Filesystem
speziell ab Beispiele10.15
imphpunit.de
link oben. Der Vorteil der Verwendung der vfs ist, dass es keine tatsächlichen Abhängigkeiten auf das ursprüngliche Dateisystem.Ja!
Sollten Sie injizieren den vollständigen Pfad irgendwie, und rufen Sie nicht sys_get_temp_dir() rechts in die Methode.
Irgendwelche nicht existierenden Pfad auslösen sollte, ein problem. Sie nicht brauchen, VFS für, die.
ABER Sie erhalten eine E_NOTICE (oder die Warnung, vielleicht?) bevor die exception ausgelöst wird. Also sollten Sie vielleicht zunächst prüfen, is_writable, und werfen die Ausnahme, wenn es false zurück.
sys_get_temp_dir
können Sie nicht immer verwenden, VSF, als das Basis-Pfad immer ein richtiger Weg.Könnte man auch brechen Sie die Funktion in 2 Methoden, einen Pfad erstellen, und die andere, es zu benutzen. Dann werden einzelne tests könnten durchgeführt werden, um sicherzustellen, wird der Pfad erstellt. Eine zweite Reihe von tests, die überprüfen könnten, und erfassen die Ausnahme, wenn Sie versuchen, einen schlechten Weg.