더북(TheBook)

에러 메시지를 보니 checkedInAttendeeCounter에 정의되지 않은 함수가 있다. 디버거로 좀 더 파보니 attendeeCollection.iterator 실행 시 checkedInAttendeeCounter에서 this가 실제로 가리킨 값은 checkedInAttendeeCounter가 아니라 전역 window 객체임을 알 수 있다.

일반적으로 this 값은 함수를 호출한 (대개 함수 앞에 점으로 연결한) 객체를 가리키지만, 콜백 함수를 만들어 넣을 때 어떤 객체를 참조하라고 직접 지정할 수는 없다. 이런 이유로 콜백 함수는 대부분 this를 명시적으로 가리킨다.

attendeeCollection.iterate에서 forEach는 콜백 내부에서 참조할 객체를 두 번째 인자로 전달함으로써 this가 무엇을 참조해야 하는지 밝힐 수 있다. attendeeCollection.iterate 개발 담당자 승현은 attendeeColleciton.iterate로 하여금 this가 참조할 객체를 두 번째 인자로 받아 forEach에 그대로 넘겨주게끔 고친다. 이렇게 해서 countIfCheckedIn 함수에 걸맞은 thischeckedInAttendeeCounter 인스턴스에 묶어둘 수 있다.

그러나 만일 attendeeCollection이 외부 업체가 납품한 라이브러리 코드라 승현이 수정할 수 없는 경우라면 무용지물 아닌가? 승현이 작성한 콜백에서 안정적으로 현재 객체 인스턴스를 가리키도록 할 순 없을까? 다행히 ‘있다’.

우선, checkedInAttendeeCounter.countIfCheckedIn 실행 시 thischeckedInAttendeeCounter 인스턴스 이외의 객체를 가리키는 상황을 가정한 단위 테스트를 짜보자(예제 5-10).

TIP

버그가 있다는 건 테스트 꾸러미가 아직 덜 됐다는 반증이다. 항상 버그를 고치기 전에 실패할 테스트를 먼저 작성하라.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.