Laravel 5.4测试路由受$ request-> ajax()保护,如何进行测试ajax请求?

时间:2017-04-17 18:07:46

标签: php ajax laravel-5

我正在尝试测试在控制器中执行不同操作的路由,无论请求是否为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());
}

当我运行测试并且只是转储响应时,我会回来'不是ajax' - 这是有道理的我猜是因为 $ this-> json()只是期待一个json响应,不一定要发出ajax请求。但我怎样才能正确测试呢?我一直在评论......

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

每次我需要对该部分代码运行测试。我想在我的测试用例中寻找如何制作ajax请求...

2 个答案:

答案 0 :(得分:9)

在Laravel 5.4测试 this-> post() this-> get() 方法接受标头作为第三个参数。 将 HTTP_X-Requested-With 设置为 XMLHttpRequest

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

我在 tests / 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'));
    }
}

然后在任何测试中,让我们说 tests / Feature / HomePageTest.php ,我可以这样做:

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

答案 1 :(得分:2)

尝试const ipcRenderer = require("electron").ipcRenderer; ipcRenderer.on('notes2', function(event, data) { // this function never gets called console.log(data); });