Как использовать PHPUnit для проверки файлов cookie и сессий? - PullRequest
11 голосов
/ 16 июня 2010

С помощью PHPUnit довольно просто протестировать необработанный код PHP, но как насчет кода, который в значительной степени зависит от файлов cookie?Хорошими примерами могут служить сессии.

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

Ответы [ 3 ]

6 голосов
/ 16 июня 2010

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

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

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

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

Ура, Алекс

2 голосов
/ 05 марта 2014

Я понимаю, что это довольно старая версия, но я считаю, что ее необходимо обновить, поскольку технология улучшилась с момента публикации. Мне удалось получить сеансы работы с этим решением, используя 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());
    }
}
0 голосов
/ 31 августа 2016

Я обнаружил, что могу использовать PHPUnit для проверки поведения части моего веб-сайта, которая в значительной степени зависит от сеансов, с помощью комбинации Curl и cookie , которая проходит 1005 * идентификатор сессии .

Следующий класс 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...