본문 바로가기
IT/PHP

Laravel -TDD(2)

by Sungjun_ 2021. 1. 13.
<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class TaskTest extends TestCase
{
    use RefreshDatabase, WithFaker;
    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function test_example()
    {
        $response = $this->get('/');

        $response->assertStatus(200);
    }
}

 

현재 TaskTest.php 파일 상태입니다.

저 상태에서 php artisan test 또는 vendor/bin/phpunit 명령어를 입력해봅시다.

윈도우를 쓰시는 분들 중에 vendor/bin/phpunit를 사용했을 때,

에러가 발생하시는 분들은 git bash를 사용하거나 php artisan test 명령어를 사용해주세요.

 

vendor/bin/phpunit

 

php artisan test

 

두 명령어의 결과 출력 방식이 조금 다릅니다.

사용하는데 문제는 없기 때문에 둘 중 사용하고 싶은 것을 사용하세요.

저는 php artisan test로 진행하겠습니다.

 

기본 상태의 파일을 테스트하면 문제 없이 잘 작동합니다.

이제 TaskTest 파일을 좀 수정하겠습니다.

 

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class TaskTest extends TestCase
{
    use RefreshDatabase, WithFaker;
    /**
     * A basic feature test example.
     *
     * @return void
     */
    public function test_tasks_index()
    {
        $response = $this->get('/api/tasks');

        $response->assertStatus(200);
    }
}

 

위와 같이 메서드를 수정했습니다.

다시 테스트 명령어로 테스트를 진행하면 에러가 발생합니다.

error 발생

응답 코드가 200이 아닌 404가 나왔습니다.

$this->withoutExceptionHandling(); 을 이용하면 더 자세한 에러를 볼 수 있습니다.

public function test_tasks_index()
    {
        $this->withoutExceptionHandling();
        $response = $this->get('/api/tasks');

        $response->assertStatus(200);
    }

 

 

error 발생

 

라우트를 설정해야 합니다.

routes 폴더 안에 있는 api.php 파일을 열어줍니다.

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use \App\Http\Controllers\Api\TaskController;
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::get('/tasks', [TaskController::class, 'index'])->name('tasks.index');

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

 

이렇게 라우트를 설정해주고 저번에 만든 TaskController.php 파일을 열어줍니다.

index 메서드를 아래와 같이 수정해줍니다.

public function index()
    {
        $task = Task::all();
        return response()->json($task, 200);
    }

 

다시 테스트 명령어를 이용해 테스트해봅시다.

성공

에러 없이 성공하는 것을 볼 수 있습니다.

 

다음은 TaskTest 파일에 store 기능을 테스트하는 메서드를 만들어줄 건데

그전에 팩토리 파일을 하나 만들어주겠습니다.

 

php artisan make:factory TaskFactory --model=Task 명령어를 입력해주면

database\factories 폴더에 TaskFactory 파일이 생성됩니다.

아래와 같이 메서드를 수정해줍니다.

<?php

namespace Database\Factories;

use App\Models\Task;
use Illuminate\Database\Eloquent\Factories\Factory;

class TaskFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = Task::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'title' => $this->faker->title,
            'story' => $this->faker->paragraph,
        ];
    }
}

 

이렇게 하면 임의로 데이터를 만들 수 있습니다.

다시 TaskTest 파일로 돌아가 메서드를 만들어줍니다.

 

public function test_tasks_store()
    {
        $task = Task::factory()->create();
        $response = $this->post('/api/tasks', $task);
        $response->assertStatus(201);
    }

 

Task 모델을 사용하기 때문에 네임스페이스에 use App\Models\Task;을 정의해야 합니다.

팩토리를 이용해 타이틀과 스토리를 임의로 만들어주었습니다.

store는 get이 아닌 post로 해야 하고, $task에 저장된 데이터를 같이 넘겨줍니다.

테스트 명령어를 실행해봅니다.

 

error

 

이런 error가 발생하는데, 메서드를 수정해줍니다.

    public function test_tasks_store()
    {
        $task = Task::factory()->create();

        $response = $this->post('/api/tasks', $task->toArray());
        $response->assertStatus(201);
    }

 

다시 테스트를 실행합니다.

error

 

라우터를 설정 안 했습니다.

api.php로 가서 설정해줍니다.

Route::post('/tasks', [TaskController::class, 'store'])->name('tasks.store');

 

다음으로 TaskController로 가서 store 메서드를 수정합니다.

public function store(Request $request)
    {
        $task = new Task();
        $task->title = $request->title;
        $task->story = $request->story;
        $task->save();

        return response()->json($task, 201);
    }

 

다시 테스트를 실행해줍니다.

테스트

에러 없이 잘 실행됩니다.

 

$task = Task::factory()->make([
            'title' => $this->faker->title,
            'story' => $this->faker->paragraph,
        ]);

 

store에서 이 코드 결과물이 궁급하시면

메서드 안에 dd($task) 또는 dd($task->toArray())를 입력하고 테스트하면 결과를 알 수 있습니다.

 

public function test_tasks_store()
    {
        $task = Task::factory()->create();

        dd($task->toArray());

        $response = $this->post('/api/tasks', $task->toArray());
        $response->assertStatus(201);
    }

'IT > PHP' 카테고리의 다른 글

Laravel - TDD(4)  (0) 2021.01.13
Laravel - TDD(3)  (0) 2021.01.13
Laravel - TDD(1)  (0) 2021.01.13
Laravel 8 - CRUD(9)  (0) 2021.01.08
Laravel 8 - CURD(8)  (0) 2021.01.08

댓글