2010-06-16 7 views
9

Avec PHPUnit, il est assez facile de tester le code PHP brut, mais qu'en est-il du code qui dépend fortement des cookies? Les sessions pourraient être un bon exemple.Utiliser PHPUnit pour tester les cookies et les sessions, comment?

Existe-t-il une méthode qui ne nécessite pas que je configure $_COOKIE avec des données pendant mon test? C'est comme une façon de faire les choses.

+0

Pouvez-vous élaborer sur hacky? Pourriez-vous juste 'unset ($ _ COOKIE)' dans le 'setUp' du test? –

+0

Je ne veux pas vraiment traiter de ça dans mes tests. Je pense que c'est encombrement inutile et devrait être traitée automatiquement. –

Répondre

5

Ceci est un problème courant avec le code, en particulier le code PHP lagacy. La technique couramment utilisée consiste à extraire les variables COOKIE/SESSION dans des objets apparentés et à utiliser la ou les techniques d'inversion de contrôle pour extraire ces dépendances.

http://martinfowler.com/articles/injection.html

Maintenant, avant d'exécuter un test que vous instancier une version maquette d'un objet Cookie/Session et fournir des données par défaut.

J'imagine que le même effet peut être obtenu avec du code hérité en remplaçant simplement la valeur super globale avant d'exécuter le test.

Cheers, Alex

2

Je comprends que c'est assez vieux, mais je crois que cela doit être mis à jour que la technologie a amélioré depuis le poste d'origine. Je suis en mesure d'obtenir des séances de travail avec cette solution en utilisant php 5.4 avec PHPUnit 3.7:

class UserTest extends \PHPUnit_Framework_TestCase { 
    //.... 
    public function __construct() { 
     ob_start(); 
    } 

    protected function setUp() { 
     $this->object = new \User(); 
    } 

    public function testUserLogin() { 
     $this->object->setUsername('test'); 
     $this->object->setPassword('testpw'); 
     // sets the session within: 
     $this->assertEquals(true, $this->object->login()); 
    } 
} 
+1

Une recherche plus poussée m'a conduit à l'implémentation correcte (dans mon esprit) de la mise en mémoire tampon de sortie comme une annotation: @outputBuffering activé Mettez cela dans les commentaires sur la fonction et il s'occupe du problème de mise en mémoire tampon. – Etrahkad

0

J'ai trouvé que je pouvais utiliser PHPUnit pour tester le comportement de la part de mon site Web qui repose en grande partie sur les sessions, grâce à une combinaison de Curl et un cookie qui passe l'ID de session .

La classe Curl suivante utilise l'option CURLOPT_COOKIE pour transmettre un paramètre de session. La variable statique $sessionid enregistre la session entre différents appels Curl. En outre, les sessions peuvent être modifiées à l'aide de la fonction statique changeSession.

class Curl { 
    private $ch; 
    private static $sessionid; 

    public function __construct($url, $options) { 
     $this->ch = curl_init($url); 

     if (!self::$sessionid) 
      self::$sessionid = .. generateRandomString() ..; 

     $options = $options + array(
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_COOKIE => 'PHPSESSID=' . self::$sessionid); 

     foreach ($options as $key => $val) { 
      curl_setopt($this->ch, $key, $val); 
     } 
    } 

    public function getResponse() { 
     if ($this->response) { 
      return $this->response; 
     } 

     $response = curl_exec($this->ch); 
     $error = curl_error($this->ch); 
     $errno = curl_errno($this->ch); 
     $header_size = curl_getinfo($this->ch, CURLINFO_HEADER_SIZE); 
     $this->header = substr($response, 0, $header_size); 
     $response = substr($response, $header_size); 

     if (is_resource($this->ch)) { 
      curl_close($this->ch); 
     } 

     if (0 !== $errno) { 
      throw new \RuntimeException($error, $errno); 
     } 

     return $this->response = $response; 
    } 

    public function __toString() { 
     return $this->getResponse(); 
    } 

    public static function changeSession() { 
     self::$SESSIONID = Practicalia::generateRandomString(); 
    } 
} 

Un exemple appel

$data = array(
    'action' => 'someaction', 
    'info' => 'someinfo' 
); 

$curl = new Curl(
    'http://localhost/somephp.php', 
    array(
     CURLOPT_POSTFIELDS => http_build_query($data))); 

$response = $curl->getResponse(); 

Et tous les appels ultérieurs Curl utilisera automatiquement la même session que le précédent, sauf indication Curl::changeSession() est appelée.

Questions connexes