1

我正在尝试使用 codeception 和 PhpBrowser(它使用 Mink 和 Goutte 驱动程序)测试我的 ajax 脚本。

我的 ajax 脚本需要经过身份验证的会话才能执行,并且会话是通过我的登录页面创建的。

我在获取 PhpBrowser/Link 会话时遇到问题,在登录后仍然存在。

我创建了一个 PhpBrowser Helper 函数来覆盖 _initialize,这样我就可以让 https 在我的测试服务器上使用自签名证书,如下所示:

public function _initialize()
{
    $client = new \Behat\Mink\Driver\Goutte\Client();
    $driver = new \Behat\Mink\Driver\GoutteDriver($client);

    $curl_config = array_merge($this->curl_defaults, $this->config['curl']);
    array_walk($curl_config, function($a, &$b) { $b = "curl.$b"; });
    $curl_config['ssl.certificate_authority']=false;
    $client->setClient(new \Guzzle\Http\Client('', $curl_config));
    $client->followRedirects(true);
    $this->session = new \Behat\Mink\Session($driver);
    \Codeception\Util\Mink::_initialize();
}

现在,当我运行验收测试时,登录似乎正常工作,并且重定向基于 apache access_logs 发生,但 PHPSESSID cookie 不会持续存在,因此登录后我的所有访问请求都是未经授权的。

我尝试通过比较

$I->getCurrentUrl()
$I->getResponseHeaders()

重定向之前和之后。

currentUrl() 返回值永远不会到达重定向目标,尽管 apache access_logs 另有说明。

getResponseHeaders() 在表单提交后返回一个 PHP_SESSID cookie,但对于之后的所有请求,它并不存在。

任何想法/猜测为什么在登录期间创建的会话在重定向后没有持续存在?

我是否需要对 Mink 会话进行任何特殊配置以使它们遵循重定向,还是我做错了什么?

在此先感谢您的帮助!

-埃德

4

1 回答 1

1

我终于弄清楚了这个问题。

我必须在覆盖的 _initialize 函数中明确设置要为 /Guzzle/Http/Client 对象保存的 cookie。

public function _initialize()
{
    $client = new \Behat\Mink\Driver\Goutte\Client();
    $driver = new \Behat\Mink\Driver\GoutteDriver($client);
    $cookiePlugin = new \Guzzle\Plugin\Cookie\CookiePlugin(new \Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar());

    $curl_config = array_merge($this->curl_defaults, $this->config['curl']);
    array_walk($curl_config, function($a, &$b) { $b = "curl.$b"; });
    $curl_config['ssl.certificate_authority']=false;
    $guzzle_client = new \Guzzle\Http\Client('', $curl_config);
    $guzzle_client->addSubscriber($cookiePlugin);

    $client->setClient($guzzle_client);
    $client->followRedirects(true);
    $this->session = new \Behat\Mink\Session($driver);
    \Codeception\Util\Mink::_initialize();
}
于 2013-04-24T17:54:15.787 回答