我正在尝试使用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
答案 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();
}