<?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 명령어를 사용해주세요.
두 명령어의 결과 출력 방식이 조금 다릅니다.
사용하는데 문제는 없기 때문에 둘 중 사용하고 싶은 것을 사용하세요.
저는 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);
}
}
위와 같이 메서드를 수정했습니다.
다시 테스트 명령어로 테스트를 진행하면 에러가 발생합니다.
응답 코드가 200이 아닌 404가 나왔습니다.
$this->withoutExceptionHandling(); 을 이용하면 더 자세한 에러를 볼 수 있습니다.
public function test_tasks_index()
{
$this->withoutExceptionHandling();
$response = $this->get('/api/tasks');
$response->assertStatus(200);
}
라우트를 설정해야 합니다.
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가 발생하는데, 메서드를 수정해줍니다.
public function test_tasks_store()
{
$task = Task::factory()->create();
$response = $this->post('/api/tasks', $task->toArray());
$response->assertStatus(201);
}
다시 테스트를 실행합니다.
라우터를 설정 안 했습니다.
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 |
댓글