2017-04-17 96 views
1

我想測試一個路由,在控制器中執行不同的操作,無論請求是否是ajax。

public function someAction(Request $request) 
{ 
    if($request->ajax()){ 
     // do something for ajax request 
     return response()->json(['message'=>'Request is ajax']); 
    }else{ 
     // do something else for normal requests 
     return response()->json(['message'=>'Not ajax']); 
    } 
} 

我的測試:

public function testAjaxRoute() 
{ 
    $url = '/the-route-to-controller-action'; 
    $response = $this->json('GET', $url); 
    dd($response->dump()); 
} 

當我運行測試,只是甩我找回響應「不阿賈克斯 - 這是有道理我猜原因$這個 - > JSON()只是期待返回一個json響應,不一定會發出ajax請求。但是我怎樣才能正確地測試這個?我一直在評論...

// if($request->ajax(){ 
    ...need to test this code 
// }else{ 
    // ... 
// } 

每次我需要運行該部分代碼的測試。我在尋找如何讓我的測試情況下,我想一個Ajax請求......

回答

2

在Laravel 5.4測試這個 - >後()這個 - > get()方法接受標頭作爲第三個參數。 設置HTTP_X請求,隨着XMLHttpRequest的

$this->post($url, $data, array('HTTP_X-Requested-With' => 'XMLHttpRequest')); 

我添加了兩種方法來測試/ TestCase.php讓用戶輕鬆。

<?php 

namespace Tests; 

use Illuminate\Foundation\Testing\TestCase as BaseTestCase; 

abstract class TestCase extends BaseTestCase 
{ 
    use CreatesApplication; 

    /** 
    * Make ajax POST request 
    */ 
    protected function ajaxPost($uri, array $data = []) 
    { 
     return $this->post($uri, $data, array('HTTP_X-Requested-With' => 'XMLHttpRequest')); 
    } 

    /** 
    * Make ajax GET request 
    */ 
    protected function ajaxGet($uri, array $data = []) 
    { 
     return $this->get($uri, array('HTTP_X-Requested-With' => 'XMLHttpRequest')); 
    } 
} 
從任何測試中

然後,讓我們說測試/特徵/ HomePageTest.php,我可以這樣做:

public function testAjaxRoute() 
{ 
    $url = '/ajax-route'; 
    $response = $this->ajaxGet($url) 
     ->assertSuccessful() 
     ->assertJson([ 
      'error' => FALSE, 
      'message' => 'Some data' 
     ]); 
} 
1

嘗試$response = \Request::create($url, 'GET', ["X-Requested-With" => "XMLHttpRequest"])->json();

+0

這提出一個要求,但它不具備其他功能測試如, - > assertStatus(200)和 - > decodeResponseJson() – cmac

+1

您通過顯示第三個參數是[「X-Requested-With」=>「XMLHttpRequest」] $ this-> get()和$ this-> post()也除外,並且它們從任何類組成的所有laravels測試內容中延伸...所以,謝謝! – cmac