在 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() 以查看响应。
我在 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() 以查看响应。