5.8.25 버전부터 Response::assertViewHas()로 공유 데이터도 확인 가능 free

2019-07-01

안녕하세요. 이현석입니다.


1 1 벨 첫 공 컨텐트네요!
다시 한 번 구독해주신 여러분들께 모두 감사드립니다.


첫 글은 샘플에 이어 벨 5.8.25,26 관련 내용입니다. 그럼 재미있게 즐겨주세요!


5.8.25 버전부터 Response::assertViewHas()로 공유 데이터도 확인 가능


벨에는 뷰에 데이터를 제대로 넘겨주는지를 테스트하는 기능이 있다. assertViewHas()가 바로 그것이다.


public function testViewDataExist() {
$this->get('/')->assertViewHas('foo', 'fooValue');
}

위와 같은 테스트가 있다고 할때, 아래와 같이 뷰에 데이터를 넘겨주면 테스트를 통과할 수 있다.


Route::get('/'. function() {
return view('sample', ['foo' => 'fooValue']);
});

한편 벨은 모든 뷰에 데이터를 공유하는 기능이 있다. 하지만, assertViewHas()는 공유된 데이터는 테스트하지 못하는 문제가 있었다.


아래처럼 하면 실제로는 모든 뷰에 bar가 공유되지만, 5.8.24 이하 버전에서 테스트를 실행하면 bar를 찾지 못한다며 에러가 발생한다.


class AppServiceProvider extends ServiceProvider
{
public function boot()
{
View::share('bar', 'barValue');
}
}
public function testViewDataExist()
{
$response = $this->get('/');
$response->assertViewHas('foo', 'fooValue');
$response->assertViewHas('bar', 'barValue');
}

스크린샷 2019-07-01 오후 6.41.22.png


뷰에 직접 넘겨준 foo와 달리 모든 뷰가 공유하는 bar는 찾지 못한다


그래서 5.8.25 버전에서는 assertViewHas()가 공유 데이터까지 검증할 수 있도록 변경되었다.


스크린샷 2019-07-01 오후 7.58.44.png


5.8.25 이상 버전에선 테스트를 통과한다.


그럼 이전에는 모든 뷰에 공유된 데이터는 어떻게 테스트했을까? 궁리도 해보고 찾아도 봤지만 마땅히 좋은 방법을 찾아내지 못했다. 내 경우에는 좀 무한 방법이지만 assertSee() 류의 어설션을 사용했던 것 같다. 값이 화면에 제대로 표시됐는지 본 것이다. 당연히 제대로된 테스트는 아니다. 모든 데이터가 화면에 표시되는 것도 아니고, 모든 뷰에 공유한다는 의미를 반영하는 테스트도 아니기 때문이다.


이 전 글에서 살펴본 우트 목록을 JSON으로 파싱하는 기능과 함께 쓰면 효과적으로 모든 뷰에 공유하는 데이터를 테스트할 수 있을 것이다. GET 우트를 모두 조회한 다음 이를 순회하면서 뷰에 공유 데이터가 제대로 넘어가고 있는지 확인하는 으로 하면, 우트가 추가되어도 신경 쓸 필요가 없고, 공유 데이터가 변경되면 한 곳에서만 변경하면 된다.


2019년 7월 1

1 1


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

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

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

이현석

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