해리의 데브로그

Test Driven Laravel 01 - GET STARTED / Book:Create 테스트 코드 구현

|

Coder’s tape의 Test Driven Laravel 강의 를 듣고 정리한 포스팅 입니다.

1. PHPUnit Setup

.env에서 데이터베이스를 sqlite로 설정

DB_CONNECTION=sqlite

sqlite 데이터베이스 생성

touch database/database.sqlite 

2. Create(store) 테스트 코드 구현

Tests/Feature/BookReservationTest.php 생성 후, 데이터를 추가하는 기본코드 작성

  • php artisan make:test bookReservationTest
class BookReservationTest extends TestCase
{
    /** @test */
    public function a_book_can_be_added_to_the_library()
    {
        $response = $this->post('/books', [
            'title' => 'cool book title',
            'author' => 'harry'
        ]);

        $response->assertOk();
        $this->assertCount(1, book::all());
    }
}

withoutExceptionHandling 는 phpuit test 결과로 어떠한 에러가 발생했는지를 알려줌.

$this->withoutExceptionHandling();

라우터 및 컨트롤러 생성

Route::post('/book', 'BooksController@store');

php artisan make:controller BooksController

데이터를 생성하여 저장시키기 위해, 컨트롤러 내 store 메소드생성

class BooksController extends Controller
{
    public function store()
    {
    }
}

모델 생성 & 마이그레이션 적용. 이후, BookReservationTest.php 및 BooksController 에 모델 Book을 import해줌.

php artisan make:model Book -m

또한, use refreshDatabase; 를 테스트 파일 내부에서 import시킴. 이 코드는 테스트를 동작시킬 때 마다 데이터베이스를 초기화 시키는 역할을 함.

use App\Book;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class BookReservationTest extends TestCase
{
    use refreshDatabase;

모델에 mass assignment 설정

class Book extends Model
{
    protected $guarded = [];
}

마이그레이션에 title, author 추가

public function up()
{
  Schema::create('books', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('title');
    $table->string('author');
    $table->timestamps();
  });
}

3. 유효성 검증 테스트 코드 작성

제목 유효성 검증에 대한 테스트케이스 작성

/** @test */
public function a_title_is_required()
{
  $this->withoutExceptionHandling();
  $response = $this->post('/books', [
    'title' => '',
    'author' => 'harry'
  ]);

  $response->assertSessionHasErrors('title');
}

컨트롤러에 유효성 검증에 대한 코드 추가

class BooksController extends Controller
{
    public function store()
    {
        $data = request()->validate([
            'title'=>'required',
            'author'=> 'required'
        ]);

        Book::create($data);
    }
}

모든 프로세스가 완료 되었으나, withoutExceptionHandling() 로 에러메세지가 반환되므로 이 부분은 주석처리

/** @test */
public function a_title_is_required()
{
  //$this->withoutExceptionHandling();
  $response = $this->post('/books', [
    'title' => '',
    'author' => 'harry'
  ]);

  $response->assertSessionHasErrors('title');
}

마찬가지로, 작가명이 누락된 테스트케이스도 작성 가능

/** @test */
public function an_author_is_required()
{
  // $this->withoutExceptionHandling();
  $response = $this->post('/books', [
    'title' => 'cool book title',
    'author' => ''
  ]);

  $response->assertSessionHasErrors('author');
}

Comments