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


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


유료 구독자 전용 레터입니다.

한 달 1만원으로 매일 라라벨 관련 메일 받아보시고 과거 메일도 열람하세요. 일반 구독으로 공개글만 받아보실 수도 있습니다.

구독하기 버튼을 눌러주시면 구독과 동시에 xly에도 가입됩니다.

이현석

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