2017-04-17 98 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