Test Driven Laravel 11 - 최종 리팩토링
09 Jan 2020 | PHP TDD Laravel coderstapeCoder’s tape의 Test Driven Laravel 강의 를 듣고 정리한 포스팅 입니다.
1. Feature Test: Author - create(store) 테스트 코드 리팩토링
기존 코드
class AuthorManagementTest extends TestCase
{
use RefreshDatabase;
/** @test */
public function an_author_can_be_created()
{
$this->withoutExceptionHandling();
$this->post('/author', [
'name' => 'Author Name',
'dob' => '05/14/1998'
]);
$author = Author::all();
$this->assertCount(1, $author);
$this->assertInstanceOf(Carbon::class, $author->first()->dob);
$this->assertEquals('1998/14/05', $author->first()->dob->format('Y/d/m'));
}
}
엔드포인트를 복수형으로 변경 (/author -> /authors ) & 라우트도 그에 맞게 수정
$this->post('/authors', [
'name' => 'Author Name',
'dob' => '05/14/1998'
]);
Route::post('/authors', 'AuthorsController@store');
데이터와 함께 엔드포인트에 도달하는 로직을 추출하여 새로운 메소드로 분리시킴
public function an_author_can_be_created()
{
$this->withoutExceptionHandling();
$this->post('/authors', $this->data());
$author = Author::all();
$this->assertCount(1, $author);
$this->assertInstanceOf(Carbon::class, $author->first()->dob);
$this->assertEquals('1998/14/05', $author->first()->dob->format('Y/d/m'));
}
private function data()
{
return [
'name' => 'Author Name',
'dob' => '05/14/1998'
];
}
2. Feature Test - Author 유효성 검증(작가 이름 필요)
기본 코드 작성
/** @test */
public function a_name_is_required()
{
$response = $this->post('/authors', array_merge($this->data(), ['name' => '']));
$response->assertSessionHasErrors('name');
}
에러발생. AuthorsController@store
는 현재 유효성 검증을 하고 있지 않음. 따라서 유효성 검증 코드 작성한 후, 테스트를 돌리면 정상적으로 테스트가 동작함.
// Session is missing expected key [errors].
class AuthorsController extends Controller
{
public function store()
{
$data = request()->validate([
'name' => 'required',
'dob' => '',
]);
Author::create($data);
}
}
3. Feature Test - Author 유효성 검증(Date Of Birth 필요)
/** @test */
public function a_dob_is_required()
{
$response = $this->post('/authors', array_merge($this->data(), ['dob' => '']));
$response->assertSessionHasErrors('dob');
}
동일한 에러가 발생함. 테스트가 동작할 수 있도로 유효성 검증을 통해 해당 필드가 필수가 되도록 수정
// Session is missing expected key [errors].
class AuthorsController extends Controller
{
public function store()
{
$data = request()->validate([
'name' => 'required',
'dob' => 'required',
]);
Author::create($data);
}
}
4. 유효성 검증 코드 리팩토링
BooksController@validateRequest
메소드를 통해 유효성 검증하는 부분을 추출하여 따로 뺀 것처럼, AuthorController@validateRequest
메소드를 동일한 방식으로 구현하여 리팩토링을 진행
class AuthorsController extends Controller
{
public function store()
{
Author::create($this->validateRequest());
}
private function validateRequest()
{
return request()->validate([
'name' => 'required',
'dob' => 'required',
]);
}
}
Comments