Versuch, Dateisystemoperationen mit VFSStream zu testen

8

Ich versuche, eine Dateisystemoperation (naja, eigentlich eine Lektüre von php: // input) mit vfsStream zu verspotten, aber das Fehlen anständiger Dokumentation und Beispiele behindert mich wirklich.

Der relevante Code der getesteten Klasse lautet wie folgt:

%Vor%

Das Setup, das ich in meinem PHPUnit-Test verwende, ist wie folgt:

%Vor%

In einem tatsächlichen Test (der eine Methode aufruft, die getHandle () indirekt auslöst) versuche ich, das VFS einzurichten und eine Assertion wie folgt auszuführen:

%Vor%

Dies führt nur dazu, dass der Test aufhört.

Offensichtlich mache ich hier etwas sehr falsches, aber angesichts des Zustands der Dokumentation kann ich nicht herausfinden, was ich tun soll. Ist das etwas, das von vfsstream verursacht wird, oder spottet phpunit über das, was ich hier sehen muss?

    
GordonM 28.07.2012, 10:57
quelle

2 Antworten

9

Also ... wie testet man mit Streams? Alle vfsStream bietet einen benutzerdefinierten Stream-Wrapper für Dateisystemvorgänge. Sie benötigen die vollständige vfsStream-Bibliothek nicht, nur um das Verhalten eines einzelnen Stream-Arguments nachzuahmen - es ist nicht die richtige Lösung. Stattdessen müssen Sie Ihren eigenen einmaligen Stream-Wrapper schreiben und registrieren, da Sie nicht versuchen, Dateisystemoperationen zu überspielen.

Angenommen, Sie haben folgende einfache Klasse zum Testen:

%Vor%

Im wirklichen Leben machst du:

%Vor%

Um es zu testen, erstellen wir einen eigenen Stream-Wrapper, der es uns ermöglicht, das Verhalten des Streams, den wir übergeben, zu steuern. Ich kann nicht zu sehr ins Detail gehen, da benutzerdefinierte Stream-Wrapper ein großes Thema sind. Aber Grundsätzlich läuft der Prozess so:

  1. Erstellen Sie einen benutzerdefinierten Stream-Wrapper
  2. Registrieren Sie diesen Stream Wrapper mit PHP
  3. Öffnen Sie einen Ressourcen-Stream mit dem registrierten Stream-Wrapper-Schema

Ihr benutzerdefinierter Stream sieht also ungefähr so ​​aus:

%Vor%

Dann würden Sie das in Ihrem Testfall tun:

%Vor%

Dann können Sie einfach die statischen Eigenschaften ändern, die ich im Stream-Wrapper definiert habe, um zu ändern, welche Daten beim Lesen des Streams zurückkommen. Oder erweitern Sie Ihre Basis-Stream-Wrapper-Klasse und registrieren Sie sie stattdessen, um verschiedene Szenarien für Tests bereitzustellen.

Dies ist ein sehr einfaches Intro, aber der Punkt ist folgender: Verwenden Sie vfsStream nur, wenn Sie sich über tatsächliche Dateisystemoperationen lustig machen - dafür ist es gedacht. Schreiben Sie andernfalls einen benutzerdefinierten Stream-Wrapper zum Testen.

PHP bietet eine Prototyp-Wrapper-Klasse für den Einstieg: Ссылка

    
rdlowrey 28.07.2012, 20:23
quelle
0

Ich habe mit dem Finden einer ähnlichen Antwort gekämpft - ich fand die Dokumentation auch fehlend.

Ich vermute, Ihr Problem war, dass vfs://testReqBody/data kein Pfad zu einer vorhandenen Datei war (wie php://input immer sein wird.)

Wenn die angenommene Antwort eine akzeptable Antwort ist, dann ist dies das Äquivalent zu vfsStreamWrapper.

%Vor%

Alternativ, wenn Sie dies aufteilen müssen, so dass Sie den Inhalt nach dem Aufruf von vfsStream::setup() definieren, ist dies wie.

%Vor%

Eine weitere Sache, die Sie in Ihrem ursprünglichen Code beachten sollten, ist, dass Sie vfsStreamWrapper::register(); nicht aufrufen müssen, wenn Sie vfsStream::setup()

verwenden     
user2045006 28.02.2017 21:36
quelle