Laravel의 API 테스트에서 API 요청 방법을 잘못 알고 테스트에 실패한 사연

10088 단어 Laravel
Laravel의 업데이트 API 테스트에서 API의 요청 방법 오류로 인해 테스트 실패로 인해 고민하는 이야기를 적습니다.
공식 문서를 잘 읽는 것은 당연한 일이지만 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)
공식 문서 잘 읽어주세요. 자기

좋은 웹페이지 즐겨찾기