你可以让Mink遵循从https到http的重定向并保持会话吗?

时间:2013-04-19 02:38:56

标签: php symfony acceptance-testing mink goutte

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

我的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();
}

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

我通过比较

尝试在验收测试中对此进行测试
$I->getCurrentUrl()
$I->getResponseHeaders()

重定向之前和之后。

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

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

任何想法/猜测登录期间创建的会话在重定向后都不会持续存在?

我是否需要对Mink会话进行任何特殊配置以使其遵循重定向,或者我是否在做其他错误的操作?

提前感谢您的帮助!

-Ed

1 个答案:

答案 0 :(得分: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();
}