在 phpunit 中为 Laravel json API 编写测试

Write tests in phpunit for Laravel json API

我在 laravel 中为我的 API 创建测试时遇到问题。看看我的 routes.php:

Route::group(['middleware' =>'api', 'prefix' => '/api/v1', 'namespace' => 'Api\V1'], function () {


    Route::post('/login', 'Auth\AuthController@postLogin');

    Route::group(['middleware' =>'jwt.auth'], function () {
        Route::post('/projects', 'ProjectsController@postProjects');
        ...
    });

});

我的 ProjectsController@postProjects 看起来像这样(我通过 POSTman 测试它并且工作正常):

public function postProjects() {
    $project = new Project;
    $project->fill(request()->all());
    $project->user_id = Auth::user()->id;
    $project->save();
    return ['project_id' => $project->id];
}

我使用 JWT cookie 编写了自己的身份验证中间件here. But in my test, I try to turn off middelware (use WithoutMiddleware)and act as logged user (actingAs($user) - I have user (id=1) in my DB). My test looks like that (I wrote it using this documentation):

<?php

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use App\Models\User;

class ProjectsTest extends TestCase
{
    use WithoutMiddleware;

    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {

        $user = User::find(1);

        $this->actingAs($user)
                ->json('POST', '/projects', ['name' => 'Project_test_name' ])
                ->seeJson([
                 'project_id' => 1,
             ]); // THIS IS LINE 26
    }
}

但是我在执行 vendor/bin/phpunit 的过程中得到以下错误:

Time: 182 ms, Memory: 13.75MB

There was 1 error:

1) ProjectsTest::testBasicExample ErrorException: Invalid argument supplied for foreach()

/Users/Kamil/Desktop/Code/kumarajiva.com/vendor/laravel/framework/src/Illuminate/Support/Arr.php:494 /Users/Kamil/Desktop/Code/kumarajiva.com/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php:232 /Users/Kamil/Desktop/Code/kumarajiva.com/vendor/laravel/framework/src/Illuminate/Foundation/Testing/Concerns/MakesHttpRequests.php:257 /Users/Kamil/Desktop/Code/kumarajiva.com/tests/ProjectsTest.php:26

FAILURES! Tests: 2, Assertions: 2, Errors: 1.

知道如何处理这个错误吗?

我遇到了同样的错误。后来我发现了问题:服务器没有返回 JSON,而是返回了 "Unauthorized" 错误。尝试将响应解析为 JSON 会引发错误。

尝试添加 ->dump() 而不是 seeJson() 以查看响应。