더북(TheBook)

기대식을 평가하는 시점에 checkInNumber가 아직 설정되지 않았다는 에러 메시지다. 어디서 잘못됐을까? 다음 두 가지만 알면 원인은 자명하다.

Promise는 비동기적이다.

자바스크립트는 이벤트 루프로 멀티 스레딩(multi-threading)을 모방했지만, 어디까지나 싱글 스레드 방식으로 움직인다.

즉, 자바스크립트 이벤트 루프에서 다음 차례가 오기 전까지는 Promisethen 메서드에 구현된 성공 콜백으로 프로그램 제어권이 넘어갈 리 없다(1장에서 자바스크립트는 싱글 스레드 기반이라고 말했다). 단위 테스트는 자신의 소임을 다하기 전까지 자기 차례를 양보하는 법이 없다. 다시 말해, 이미 기대식 평가는 옛날에 끝난 터라 Promise 귀결 시점에는 너무 늦어버린 꼴이다!

예제 코드를 내려받아 중단점을 설정하고 실행해보면 알 수 있다. checkInService_01.jscheckInService_01_tests.js에 중단점을 넣고 checkInService_01.html을 실행하면 다음 순서로 코드가 흘러간다.

1. 단위 테스트 첫 번째 줄

checkInService.checkIn(attendee);

2. 스파이가 Promise를 반환

Promise.resolve(checkInNumber);

3. 단위 테스트 두 번째 줄 기대식

expect(attendee.getCheckInNumber()).toBe(checkInNumber);

4. attendee.js의 성공 콜백(너무 늦었다!)

setCheckInNumber: function(number) {
checkInNumber = number;
}

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