5.8.28 새기능 1 - TestResponse에 tap 기능 추가 free

2019-07-10

마침 어제 tap에 대해 알아봤는데 오늘 발표된 5.8.28에 tap 관련 신기능이 추가되었다는 소을 들으니 왠지 반갑네요!


5.8.28 새기능 1 - TestResponse에 tap 기능 추가


TestResponse에 Tappable 트레이트가 추가됐다. 아주 간단한 변화이다. 하지만 알아두면 테스트 작성이 조금 더 수월해질 수 있다.


class TestResponse
{
use Macroable {
__call as macroCall;
}

위의 코드가 아래와 같이 바뀌었다.


class TestResponse
{
use Tappable, Macroable {
__call as macroCall;
}

벨은 기본적으로 임시 변수를 쓰지 않고도 테스트를 할 수 있고, 테스트를 연속으로 연결할 수도 있다.


// 임시 변수 사용
$response = $this->get('/');
$repsonse->assertOk();

// 임시 변수를 쓰지 않아도 된다.
$this->get('/')
->assertOk();

// 테스트를 연결할 수 있다.
$this->get('/')
->assertOk()
->assertSee('welcome');

테스트를 연결해서 작성할 수 있는 건 어설션 메소드가 자기자신(TestResponse)를 반환하는 덕분이다. 기존에는 어설션 이외의 메소드를 사용해야할 때는 체이닝을 중단하는 수밖에 없었다.


예를 들어 응답의 컨텐츠를 테스트하려면 getContent() 메소드를 호출하기 위해 체이닝이 중지된다.


$response = $this->get('/')
->assertOk();

$content = $response->getContent(); // TestResponse를 반환하지 않기 때문에 더이상 어설션을 연결할 수 없다.

$this->assertEquals('welcome', $content);

혹은

$content = $this->get('/')
->assertOk()
->getContent();

$this->assertEquals('welcome', $content);

벨 5.8.28 부터는 TestResponse를 tap 할 수 있으므로 다음과 같이 할 수 있다.


$this->get('/')
->assertOk()
->tap(function (TestResponse $response) {
$this->assertEquals('welcome', $response->getContent());
})
->assertStatus(200);

어찌보면 변수에 한 번 담고 안담고 정도의 미미한 차이지도 모르겠다. 오히려 타이핑 수는 늘어날지도 모르겠다. 하지만 하나의 요청에 관한 모든 테스트가 끊기지 않고 연결된다면 테스트 코드를 요청을 단위로 구분하여 파악하기가 확실히 좋을 것 같긴 하다.


tap() vs Tappable 트레이트


잠깐.. 어제자 1 1 벨을 읽으신 분들은 어제 본 tap()과 사용 방법이 조금 다르다는 느낌을 받았을 것 같다. 다시 한 번 복습해보면 tap() 헬퍼 메소드의 사용법은 아래와 같다.


$user = tap($user, function($user) {
$user->update();
});

혹은

$user = tap($user)->update();

앞서 살펴본 테스트 코드에 적용해보면 아래와 같이 될 것이다.


tap($this->get('/')->assertOk(), function (TestResponse $response) {
$this->assertEquals('welcome', $response->getContent());
})->assertStatus(200);

뭔가 읽기 어려운 느낌이다. 그래서 파스칼 발젯(Pascal Baljet)이 Tappable 트레이트를 만들어서 벨 5.8.17에 추가했다.


Tappable 트레이트를 쓰는 모든 클래스는 tap() 메소드를 사용할 수 있다. 파스칼 발젯이 예로 제시한 코드를 보면 tap을 안쓸때, tap을 쓸때, Tappable 트레이트를 쓸 때의 차이를 쉽게 느낄 수 있을 것이다.


// tap을 쓰지 않을 때
$tappable = TappableClass::make();
$tappable->doSomething();
$tappable->doSomethingElse();
$result = $tappable->getResult();

// tap 메소드를 쓸 때
$result = tap(TappableClass::make(), function ($tappable) {
$tappable->doSomething();
$tappable->doSomethingElse();
})->getResult();

// Tappable 트레이트를 쓸 때
$result = TappableClass::make()->tap(function ($tappable) {
$tappable->doSomething();
$tappable->doSomethingElse();
})->getResult();

===


2019년 7월 10
1 1


의견, 질문, 하고 싶은 말씀이 있다면 편하게 답장 주세요~



이현석

바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.