Test Driven Laravel 01 - GET STARTED / Book:Create 테스트 코드 구현
30 Dec 2019 | PHP TDD Laravel coderstapeCoder’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