Laravel의 API 테스트에서 API 요청 방법을 잘못 알고 테스트에 실패한 사연
10088 단어 Laravel
공식 문서를 잘 읽는 것은 당연한 일이지만 API 테스트에서
json
방법을 사용하세요.동적 입력 프롬프트에서 클릭
예를 들어
form
태그 submit
는 검증 오류가 발생하면 입력 화면으로 방향을 바꾸려고 합니다.또한 AJAX의 API 요청으로 인증 오류가 발생하면 JSON에서 오류 정보를 반환합니다.
HTTP 상태 코드를 사용하여 302로 방향을 변경하고 잘못된 JSON 응답을 422로 확인합니다.
Laravel 인증 시 사용하는 양식 요청은 이 부근의 처리를 자동으로 처리합니다.감사합니다
공식 문서도 잘 썼어요.
If the request was an AJAX request, a HTTP response with a 422 status code will be returned to the user including a JSON representation of the validation errors.
테스트에서 HTTP 상태 코드 전환과 관련된 API 호출 방법을 재현하지 않았기 때문에 테스트 실패가 고민입니다.
재현을 위해 Laravel로 업데이트 계열의 API를 만들어 보세요.사용된 Laravel의 버전은 6입니다.x.
$ composer create-project --prefer-dist laravel/laravel apisample
$ cd apisample
$ php artisan make:request UpdateUserNameRequest
$ php artisan make:controller UpdateUserNameApi
$ php artisan make:test UpdateUserNameApiTest
routes/api.php<?php
use Illuminate\Http\Request;
Route::patch('/update_user_name', 'UpdateUserNameApi');
app/Http/Requests/UpdateUserNameRequest.php<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdateUserNameRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required',
];
}
}
이름이 필요한 폼 요청입니다.app/Http/Controllers/UpdateUserNameApi.php
<?php
namespace App\Http\Controllers;
use App\Http\Requests\UpdateUserNameRequest;
class UpdateUserNameApi extends Controller
{
public function __invoke(UpdateUserNameRequest $request)
{
// 更新処理
return response()->json(['message' => '更新完了']);
}
}
먼저 업데이트된 API이기 때문에 어떤 사용자의 이름을 업데이트해야 합니까!!다음은 테스트입니다.우선 제가 실패한 테스트를 처음 썼어요.
tests/Feature/UpdateUserNameApiTest.php
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
class UpdateUserNameApiTest extends TestCase
{
/**
* A basic feature test example.
*
* @return void
*/
public function testApi()
{
// エラー
$this->patch('/api/update_user_name', [])->assertStatus(422);
// 成功
$this->patch('/api/update_user_name', ['name' => 'Takashi'])->assertStatus(200);
}
}
patch
에서 오류를 422assertStatus(422)
로 가정해 달라고 요청합니다.하면, 만약, 만약...
$ vendor/bin/phpunit tests/Feature/UpdateUserNameApiTest.php
PHPUnit 8.5.0 by Sebastian Bergmann and contributors.
F 1 / 1 (100%)
Time: 383 ms, Memory: 18.00 MB
There was 1 failure:
1) Tests\Feature\UpdateUserNameApiTest::testApi
Expected status code 422 but received 302.
Failed asserting that false is true.
apisample/vendor/laravel/framework/src/Illuminate/Foundation/Testing/TestResponse.php:183
apisample/tests/Feature/UpdateUserNameApiTest.php:19
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
422가 아니라 302로 시험에 실패했다.생각해 보면 이 테스트에서 실행된 요청은 AJAX 요청이 아닙니다.
그래서 422가 아니라 재정의 302이다.
그렇다면 실제 운용과 마찬가지로 어떻게 API를 요구할 것인가.
tests/Feature/UpdateUserNameApiTest.php
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;
class UpdateUserNameApiTest extends TestCase
{
/**
* A basic feature test example.
*
* @return void
*/
public function testApi()
{
// エラー
$this->patchJson('/api/update_user_name', [])->assertStatus(422);
// 成功
$this->patchJson('/api/update_user_name', ['name' => 'Takashi'])->assertStatus(200);
}
}
$ vendor/bin/phpunit tests/Feature/UpdateUserNameApiTest.php
PHPUnit 8.5.0 by Sebastian Bergmann and contributors.
. 1 / 1 (100%)
Time: 112 ms, Memory: 18.00 MB
OK (1 test, 2 assertions)
공식 문서 잘 읽어주세요. 자기
Reference
이 문제에 관하여(Laravel의 API 테스트에서 API 요청 방법을 잘못 알고 테스트에 실패한 사연), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kiyc/items/692a53e1023ea72888d4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)