2010-12-21 8 views
3

Die Standardmethode für Komponententests, die auf Sitzungs-/Cookie-Informationen beruhen, besteht in der Verwendung einer Abstraktions-Bibliothek. Was aber, wenn ich diese Abstraktionsbibliothek schreiben und testen will? Die Dokumentation für das PHP setcookiefunction besagt, dass das Cookie bei der nächsten Anfrage verfügbar sein wird. Bei Verwendung eines Befehlszeilentools zum Testen gibt es keine "Anfrage". Wie kann ich die korrekten Cookie-Einstellungen testen?Unit-Test-Cookies in PHP

Ich möchte testen, ob alle Parameter der setcookie-Funktion von meiner Abstraktions-Bibliothek korrekt eingestellt sind. Diese Parameter werden nach bestimmten Bedingungen und Methodenaufrufen festgelegt.

Die einzige Lösung, die ich mir vorstellen kann, ist die setcookie Funktion mit der runkit Erweiterung, die ich nicht installieren möchte. Andere Ideen?

+0

möglich Duplikat von [PHPUnit - Unit Testing mit Elementen, die Header senden müssen] (http://StackOverflow.com/Q/190292/) – outis

+0

So sind die Antworten .. a) Verwenden Sie einen Wrapper und vergessen Sie Unit-Tests das oder b) benutze es nicht. Großartig. #fusted –

Antwort

9

fand ich eine andere, sehr einfache Lösung: Ein Klasse-Wrapper um die PHP setcookie Funktion, die so einfach ist, es muss nicht Einheit getestet werden:

/** 
* Wrapper around setcookie function for better testability 
*/ 
class Cookiesetter { 
    public function setcookie($name, $value = "", $expire = 0, $path = "", 
    $domain = "", $secure = false, $httponly = false) { 
    return setcookie($name, $value, $expire, $path, $domain, $secure, $httponly); 
    } 
} 

Die setcookie Methode dann verspottet werden kann. Dies hat den zusätzlichen Vorteil, dass ich andere Methoden wie expireCookie implementieren kann.

+0

+1 Dies ist genau der Weg, Dinge zu tun - entfernen Sie die Abhängigkeiten mit Mocks und Stubs, so dass Sie isoliert testen können. – Fenton

+10

"so einfach, es muss nicht getestet werden". Autsch! – mbfisher

2

Sie können einen Wert direkt in den aktuellen $ _COOKIE Array gesetzt:

<?php 
$_COOKIE['test']='hello'; 
print_r($_COOKIE); 
run_tests(); 

(das funktioniert auch im CLI-Modus). Beachten Sie, dass $ _REQUEST dadurch nicht aktualisiert wird.

aber wenn Sie nur versuchen, Cookies zu manipulieren, so dass Sie anschließend die Sitzung zugreifen können, warum nicht nur die Sitzung direkt zugreifen:

<?php 
$_SESSION['auth_user']='root'; 
run_tests(); 

Aber wir reden über Unit-Tests hier - nicht Test Integration - was darauf hindeutet, dass der Code nicht sehr gut strukturiert ist.

+0

Ich kann $ _COOKIE direkt einstellen, wenn ich Verhaltensweisen testen will, die von Werten in $ _COOKIE abhängen. Ich wollte aber auch testen, ob die anderen Cookie-Parameter wie Ablaufzeit und das http-only-Flag von meiner Bibliothek korrekt gesetzt sind. – chiborg

+0

Aber danke für den Kommentar zu Unit vs Integration Tests - Es sollte nicht notwendig sein, mehrere Anfragen in einem Unit-Test zu simulieren. Einige Tests zum Senden der richtigen Daten und einige Tests für die Verarbeitung der empfangenen Daten sind in Unit-Tests besser. Meine ursprüngliche Absicht, Anforderungen zu simulieren, ist daher unnötig. – chiborg

-2

können Sie immer Selenid verwenden. Ich denke, dass phpunit eine Erweiterung hat, über die Sie den Browser steuern können.