Mocking Symfony2 Anfrage-und session-in PHPUnit
Habe ich eine Klasse, die erfordert, dass die Symfony2
service @request_stack
gibt eine Instanz von Symfony\Component\HttpFoundation\RequestStack
. Ich nutze es zum abrufen von POST und GET Werte.
Und auch meine Klasse nutzt Symfony\Component\HttpFoundation\Session
aus Request->getSession()
die es aufruft, um die aktuelle Sitzung.
Recht jetzt meiner Klasse hat eine Methode, die wie folgt aussieht:
class MyClass {
public function doSomething() {
//Get request from request stack.
$Request = $this->RequestStack->getCurrentRequest();
//Get a variable from request
$var = $Request->request->get('something');
//Processes $var into $someprocessedvar and lets say it's equal to 3.
//Set value to session.
$this->Request->getSession()->set('somevar', $someprocessedvar);
}
}
Ich muss in der Lage sein:
- Mock
RequestStack
. - Bekommen
Request
ausRequestStack
- Bekommen
Session
ausReques
t;
Mit allem, was gesagt, wie kann ich testen, dass MyClass
erfolgreich der erwartete Wert in der session?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht alle code lohnt sich unit-Tests. In der Regel ist dies ein Indikator, dass der code vereinfacht werden könnte. Wenn Sie unit-test-code, der etwas komplexer ist die tests können auch zur Belastung werden und normalerweise wäre es besser zu tun, ein für die integration von edge-to-edge-test in diesen Fällen. Es ist auch nicht klar, in deinem Beispiel, wie Ihre Klasse bekommt die
RequestStack
so werde ich davon ausgehen, dass Sie gespritzt wurden, in__construct
.Mit dieser sagte, hier ist, wie würden Sie test-code:
Dadurch erhalten Sie einen Ausgangspunkt, aber Vorsicht mit einer Wand-von mocks in Ihren tests, da sehr kleine Veränderungen, um die details der Implementierung kann dazu führen, dass tests fehlschlagen, obwohl das Verhalten ist noch richtig, und das ist etwas, was Sie wollen zu vermeiden, so viel wie möglich, damit die tests sind nicht teuer in der Wartung.
Edit: ich dachte, etwas mehr über Ihre Frage und merkte, dass in der Regel können Sie injizieren die Sitzung als eine Abhängigkeit. Wenn das möglich ist in deinem Anwendungsfall würde es vereinfachen die tests eine Menge.
Brauchen Sie nicht zu verspotten
RequestStack
, es ist eine super einfache Klasse. Sie können einfach erstellen Sie eine gefälschte Anfrage und schieben Sie es auf es. Sie können auch mock der Sitzung.Aber in Bezug auf die Prüfung, zu Durcheinander herum mit den Interna einer Klasse ist kein gutes Zeichen. Vielleicht können Sie erstellen Sie eine handler-Klasse zu Kapseln, die Logik, die Sie benötigen, aus der request-stack, so können Sie testen leichter.
Es ist schwer eine situation vorstellen, wo Sie würde sein Umgang mit den GET/POST-Parameter innerhalb eines unit-getestete Klasse. Haben die Controller-Angebot mit HTTP-requests und sessions (das ist ziemlich viel, was Sie dort für), und übergeben Sie die Variablen nach unten in die entsprechenden Klassen zum Umgang mit dem rest.
That being said, Kevin ' s Reaktion ist eine mögliche Lösung, wenn Sie wollen, zu gehen, dass die route.
Laut dieser: http://api.symfony.com/2.4/Symfony/Component/HttpFoundation/Session/Storage/MockArraySessionStorage.html
Bekam ich auf der Arbeit so etwas wie die folgenden:
Nur ein test pro Objekttyp in meinem Fall, da ich nur testen, ob die session-name korrekt ist, und das abrufen/speichern des Objekts richtig in die session.
CompanyMapper
- Klasse verwendet, die Sitzung zu speichern, die Firma Objekt unter anderen session - /Applikations-bezogene Funktionen.Jemand kommen, von Google wie mich will wissen, wie man mock-Inhalte anfordern, so einfach ist es:
Wie Sie sehen können, Sie können ausführen einer realen Steuerung verwendet
$request->getContent()
Ich hoffe, das jemand hilft.