더북(TheBook)

이 테스트는 코드에 씌어있는 대로 복잡한 ReservationSaver의 기본 구현부를 createReservation 함수에 전달하고 있다. 이렇게 하면 결국 외부 시스템에 의존하게 되고 함수를 테스트하기가 어려워지므로 별로 내키지 않는다. 바로 이럴 때 재스민 스파이가 제격이다.

createReservation을 호출하기 전에 saveReservation 함수에 스파이를 심는다. 스파이로 함수 실행 여부를 알 수 있는데, 첫 번째 테스트에 아주 잘 들어맞는다.

재스민에서 전역 함수 spyOn을 쓰면 특정 함수를 몰래 들여다볼 수 있다. 이 함수의 첫 번째 인자는 객체 인스턴스, 두 번째 인자는 감시할 함수명이다. 다음과 같이 기존 테스트를 saveReservation에 스파이를 심은 코드로 바꿔보자.


it(‘예약 정보를 저장한다’, function() {
var saver = new ReservationSaver();
spyOn(saver, ‘saveReservation’);
// testPassenger와 testFlight는 이 테스트 꾸러미의
// beforeEach 함수에서 이미 설정되었다고 본다.
createReservation(testPassenger, testFlight, saver);
 
// saveReservation이 정말 호출되었는지 어떻게 알 수 있을까?
});

스파이를 써서 saver 객체의 saveReservation 구현부를 예약 데이터 저장 기능과 무관한 함수로 대체했다. 스파이는 함수를 호출한 시점과 호출 시 전달한 인자까지 정확히 포착하고, 무엇보다 재스민은 어떤 스파이가 한 번 이상 실행됐는지 확인하는 기대식을 지닌 스파이 전용 매처를 지원한다. 다음과 같이 기대식까지 추가하면 완벽한 테스트다.


it(‘예약 정보를 저장한다’, function() {
var saver = new ReservationSaver();
spyOn(saver, ‘saveReservation’);
// testPassenger와 testFlight는 이 테스트 꾸러미의
// beforeEach 함수에서 이미 설정되어 있다고 본다.
createReservation(testPassenger, testFlight, saver);
 
expect(saver.saveReservation).toHaveBeenCalled();
});

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