如何从Codeception验收测试中访问PHP会话?

时间:2017-06-27 12:24:49

标签: php codeception

是否可以从Codeception验收测试Cest文件中读取PHP的会话$_SESSION

1 个答案:

答案 0 :(得分:2)

根据https://github.com/Codeception/Codeception/issues/4362#issuecomment-311232426,浏览器会话在与测试不同的过程中运行,因此无法直接进行。

但是,我找到了一个解决方法: - )

想法:在测试中,从文件系统中读取会话sess_文件(由浏览器会话生成),然后解析它。这适用于读取访问;没有尝试过写访问。

在测试中:

$cookie = $I->grabCookie('PHPSESSID'); // according to php.ini: session.name
$sessionFile = file_get_contents(ini_get('session.save_path').'/sess_'.$cookie);
$session = self::unserialize_php($sessionFile);
codecept_debug($session); // $session is an array. Run Codeception with `--debug` to see it

unserialize函数取自http://us3.php.net/manual/en/function.session-decode.php#108037

private static function unserialize_php($session_data) {
    $return_data = array();
    $offset = 0;
    while ($offset < strlen($session_data)) {
        if (!strstr(substr($session_data, $offset), "|")) {
            throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
        }
        $pos = strpos($session_data, "|", $offset);
        $num = $pos - $offset;
        $varname = substr($session_data, $offset, $num);
        $offset += $num + 1;
        $data = unserialize(substr($session_data, $offset));
        $return_data[$varname] = $data;
        $offset += strlen(serialize($data));
    }
    return $return_data;
}

php.ini中的要求(默认情况下均满足):

  • session.save_handler = files
  • session.serialize_handler = php