더북(TheBook)

여기서 countIfCheckedIncheckedInAttendeeCounter 인스턴스를 this로 참조하는 대목을 눈여겨보자. 단위 테스트는 만사 OK라고 하지만, 과연 그럴까? checkedInAttendeeCounter를 정말 attendeeCollection 인스턴스와 함께 쓸 수 있을까? 다음 코드를 보면 실마리를 찾을 수 있으리라.


var checkInService = Conference.checkInService(Conference.checkInRecorder()),
  attendees = Conference.attendeeCollection();
  counter = Conference.checkedInAttendeeCounter();
 
// UI에서 선택한 참가자들을 참가자 컬렉션에 추가한다.
attendees.add(Conference.attendee('윤지', '김'));
attendees.add(Conference.attendee('Nick', 'Bradshaw'));
 
// 참석자들을 체크인한다.
attendees.iterate(checkInService.checkIn);
 
// 체크인을 마친 참가자 인원수를 세어본다.
attendees.iterate(counter.countIfCheckedIn);
 
console.log(counter.getCount()); // 0 (어랏??)

컬렉션에 추가한 두 참가자 모두 체크인을 마쳤으니 체크인한 참가자 인원수가 0이 될 리 없다. 단위 테스트 실행 결과만 보면 모듈 코드에 문제가 없어 보이지만, (적어도) 코드 어딘가에서 비정상적으로 작동한 게 틀림없다. 그렇지 않다면 결과는 0이 아니라 2가 나와야 한다. 예제 코드 실행 시 콘솔 창에 표시된 내용을 보자(그림 5-6).

►그림 5-6

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