2013-11-20 56 views
6

更新見下文如何模擬laravel測試用例中的xmlHttpRequests?

我的控制器(使用Request::ajax()作爲條件)Ajax和其他請求之間進行區分。這很好,但我想知道是否有單元測試控制器處理請求的方式。測試應該如何? 這樣的事情可能,但它不工作...

<?php 

    class UsersControllerTest extends TestCase 
     { 


      public function testShowUser() 
      { 
       $userId = 1; 
       $response = $this->call('GET', '/users/2/routes', array(), array(), array(
        'HTTP_CUSTOM' => array(
         'X-Requested-With' => 'XMLHttpRequest' 
        ) 
       )); 


      } 
     } 

更新

我有種找到了解決辦法。也許。由於我對測試Request類的正確功能不感興趣(很可能Laravel,Symfony等提供的所有本地類已經足夠單元測試過),所以最好的方法是模擬它的ajax方法。就像這樣:

 public function testShowUser() 
     { 

      $mocked = Request::shouldReceive('ajax') 
       ->once() 
       ->andReturn(true); 
      $controller = new UsersCustomRoutesController; 
      $controller->show(2,2); 
     } 

因爲真正Request類,而不是使用Testcase類,我不得不實例化時手動輸入指定的路線被稱爲該方法的call方法時所使用的嘲笑替代品。但我認爲這樣可以,因爲我只是想控制Request::ajax()條件中的表達式按照預期的方式工作。

+0

好問題 - [代碼](https://github.com/symfony/symfony/blob/587f35513761547e43c4538e44df485f62fcd92e/src/Symfony/Component/HttpFoundation/Request.php#L1590)用於檢測是否它是一個AJAX請求確實只是檢查你正在設置的標題。 – fideloper

回答

13

您需要前綴HTTP_實際的頭,無需使用HTTP_CUSTOM:

$server = array('HTTP_X-Requested-With' => 'XMLHttpRequest'); 
$this->call('get', '/ajax-route', array(), array(), $server); 

替代語法看起來好一點IMO:

$this->client->setServerParameter('HTTP_X-Requested-With', 'XMLHttpRequest'); 
$this->call('get', '/ajax-route'); 

這裏有一些相似的代碼示例JSON頭(Request::isJson()Request::wantsJson()):

$this->client->setServerParameter('HTTP_CONTENT_TYPE', 'application/json'); 
$this->call('get', '/is-json'); 

$this->client->setServerParameter('HTTP_ACCEPT', 'application/json'); 
$this->call('get', '/wants-json'); 

這裏有一個有用的幫助方法,你可以把它放在你的TestCase中:

protected function prepareAjaxJsonRequest() 
{ 
    $this->client->setServerParameter('HTTP_X-Requested-With', 'XMLHttpRequest'); 
    $this->client->setServerParameter('HTTP_CONTENT_TYPE', 'application/json'); 
    $this->client->setServerParameter('HTTP_ACCEPT', 'application/json'); 
} 
+0

感謝您的回答。我試了一下,它工作得很好。 –

+0

我無法獲得'$ this-> client-> setServerParameter('HTTP_CONTENT_TYPE','application/json');'在POST上工作 – Webnet

+0

在這裏很好地工作,我只是在全新安裝上進行測試。 – Andreas

5

這裏是Laravel 5.2的解決方案。

$this->json('get', '/users/2/routes'); 

就這麼簡單。


Intenally,json方法適用以下標題:

'CONTENT_LENGTH' => mb_strlen($content, '8bit'), 
'CONTENT_TYPE' => 'application/json', 
'Accept'   => 'application/json', 
3

在Laravel 5:

$this->get('/users/2/routes', ['HTTP_X-Requested-With' => 'XMLHttpRequest']); 

然後,可以鏈中的正常的斷言:

$this->get('/users/2/routes', ['HTTP_X-Requested-With' => 'XMLHttpRequest']) 
    ->seeJsonStructure([ 
     '*' => ['id', 'name'], 
    ]); 
+0

如何知道響應代碼? –

+0

' - > assertStatus(302)',在這種情況下是302重定向 –

2
$server = array('HTTP_X-Requested-With' => 'XMLHttpRequest'); 
$request = new \Illuminate\Http\Request($query = array(),$request = array(), $attributes = array(), $cookies = array(), $files = array(), $server , $content = null);