2011-11-18 95 views
3

我在我的控制器的動作,其做一些事情只有在請求是XmlHttpRequest的,就像這樣:測試Ajax請求在CakePHP 2.0

function myAction() { 
    if($this->request->is('ajax')) { 
     doSomething(); 
    } 
} 

什麼會爲這個動作看起來像一個TestCase?有沒有辦法將CakeRequest實例模擬爲Ajax請求?

回答

5

我不知道這是否是一個很好的方式或沒有,但在測試方法將做的工作的頂部添加

$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest'; 

。在這種情況下,我們將數據作爲Ajax發送,因此不需要再檢查。

+0

顯然這是接受的方式來做到這一點。 '$ _SERVER'變量在每次測試之前都會重置,所以不應該流入其他測試或測試運行器本身([來源](http://cakephp.lighthouseapp.com/projects/42648-cakephp/tickets/2819-more-靈活性換控制器測試嘲諷-cakerequest)) – contrebis

0

我們採用一些技巧來解決cake2.0

蛋糕supoprts以.json extention AJAX單元測試中,我們創建AppModel功能來欺騙的AJAX調用。像

public function isAjax() { 
    return $this->request->isAjax() || $this->request->ext == 'json'; 
} 

然後在控制器中,而不是調用$ this-> request-> isAjax(),$ this-> isAjax()被使用。

當測試與Ajax調用動作,我們只是後綴以.json添加到行動呼籲,例如,

$this->testAction('/users/register'); 

這可能不是Ajax調用測試的最終解決方案,但可能是一個解決辦法