안녕하세요. 이현석입니다.
1일 1식 라라벨 첫 공식 컨텐트네요!
다시 한 번 구독해주신 여러분들께 모두 감사드립니다.
첫 글은 샘플에 이어 라라벨 5.8.25,26 관련 내용입니다. 그럼 재미있게 즐겨주세요!
라라벨에는 뷰에 데이터를 제대로 넘겨주는지를 테스트하는 기능이 있다. 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');
}
bar
는 찾지 못한다
그래서 5.8.25 버전에서는 assertViewHas()
가 공유 데이터까지 검증할 수 있도록 변경되었다.
그럼 이전에는 모든 뷰에 공유된 데이터는 어떻게 테스트했을까? 궁리도 해보고 찾아도 봤지만 마땅히 좋은 방법을 찾아내지 못했다. 내 경우에는 좀 무식한 방법이지만 assertSee()
류의 어설션을 사용했던 것 같다. 값이 화면에 제대로 표시됐는지 본 것이다. 당연히 제대로된 테스트는 아니다. 모든 데이터가 화면에 표시되는 것도 아니고, 모든 뷰에 공유한다는 의미를 반영하는 테스트도 아니기 때문이다.
이 전 글에서 살펴본 라우트 목록을 JSON으로 파싱하는 기능과 함께 쓰면 효과적으로 모든 뷰에 공유하는 데이터를 테스트할 수 있을 것이다. GET 라우트를 모두 조회한 다음 이를 순회하면서 뷰에 공유 데이터가 제대로 넘어가고 있는지 확인하는 식으로 하면, 라우트가 추가되어도 신경 쓸 필요가 없고, 공유 데이터가 변경되면 한 곳에서만 변경하면 된다.
2019년 7월 1일
1일 1식 라라벨
메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 처음부터 제대로 배우는 라라벨(Laravel Up & Running 2nd Edition)을 번역했습니다.