2013-04-19 48 views
1

我想用codeception測試我的ajax腳本& PhpBrowser(使用Mink和Goutte驅動程序)。您可以讓貂貂遵循從https到http的重定向並保持會話?

我的ajax腳本需要經過身份驗證的會話才能執行,而會話是通過我的登錄頁面創建的。

我在使用PhpBrowser/Link會話時遇到問題,要在登錄後保留。

我創建了一個PhpBrowser助手功能覆蓋_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會話進行任何特殊配置才能讓他們遵循重定向,還是我在做其他錯誤?

在此先感謝您的幫助!

-Ed

回答

1

我終於明白了這個問題。

我不得不明確地設置cookie以保存在/覆蓋_initialize函數中的/ Guzzle/Http/Client對象。

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