2010-06-16 3 views
9

С PHPUnit довольно легко проверить необработанный PHP-код, но как насчет кода, который сильно зависит от файлов cookie? Сессии могут быть хорошим примером.Использование PHPUnit для проверки файлов cookie и сеансов, как?

Есть ли способ, который не требует установки $_COOKIE с данными во время моего теста? Это похоже на хакерский способ делать что-то.

+0

Можете ли вы подробно рассказать о хаки? Не могли бы вы просто 'unset ($ _ COOKIE)' в 'setUp' теста? –

+0

Я не хочу иметь дело с этим в своих тестах. Я чувствую, что это ненужный беспорядок, и с ним нужно обращаться автоматически. –

ответ

5

Это распространенная проблема с кодом, особенно с PHP-кодом lagacy. Используемая общая методика состоит в том, чтобы дополнительно абстрагировать переменные COOKIE/SESSION в связанных объектах и ​​использовать инверсию методов (ов) управления, чтобы вывести эти зависимости в область видимости.

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

Теперь, прежде чем выполнить тест, который вы бы создать экземпляр макет версию Cookie/объекта Session и предоставлять данные по умолчанию.

Я предполагаю, что такой же эффект может быть достигнут с устаревшим кодом, просто переопределив супер глобальное значение перед выполнением теста.

Cheers, Alex

2

Я понимаю, что это довольно старая, но я считаю, что это должен быть обновлен, поскольку технология улучшилась с должности. Я был в состоянии получить сеансы работы с этим решением с использованием PHP 5.4 с 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

Дальнейшие исследования привели меня к (на мой взгляд) правильной реализации буферизации вывода в качестве аннотации: @outputBuffer enabled Поместите это в комментарии к функции, и она заботится о проблеме буферизации. – Etrahkad

0

я обнаружил, что я мог бы использовать PHPUnit, чтобы проверить поведение части моего сайта, который в значительной мере опирается на сессиях через комбинацию от Curl и cookie, который передает session id.

Класс Curl использует параметр CURLOPT_COOKIE для передачи параметра сеанса. Статическая переменная $sessionid сохраняет сеанс между различными вызовами Curl. Кроме того, сеансы могут быть изменены с использованием статической функции 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(); 
    } 
} 

Пример вызова

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

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

$response = $curl->getResponse(); 

И все последующие вызовы Curl автоматически будет использовать тот же сеанс, как и предыдущий, если специально Curl::changeSession() не называется.

Смежные вопросы