더북(TheBook)

iterate를 구현하기 전에 일단 단위 테스트를 만들어 기능을 점검하자(예제 5-2).

예제 5-2 attendeeCollection.iterate 함수의 단위 테스트

소스 파일 5장\Callbacks\attendeeCollection_tests.js

describe(‘Conference.attendeeCollection’, function() {
 
describe(‘contains(attendee)’, function() {
  // contains 테스트
});
describe(‘add(attendee)’, function() {
  // add 테스트
});
describe(‘remove(attendee)’, function() {
  // remove 테스트
});
 
describe(‘iterate(callback)’, function() {
  var collection, callbackSpy;
 
  // 도우미 함수
  function addAttendeesToCollection(attendeeArray) {
    attendeeArray.forEach(function(attendee) {
      collection.add(attendee);
    });
  }
 
  function verifyCallbackWasExecutedForEachAttendee(attendeeArray) {
    // 각 원소마다 한 번씩 스파이가 호출되었는지 확인한다.
 
    expect(callbackSpy.calls.count()).toBe(attendeeArray.length);
 
    // 각 호출마다 spy에 전달한 첫 번째 인자가 해당 attendee인지 확인한다.
    var allCalls = callbackSpy.calls.all();
    for (var i = 0; i < allCalls.length; i++) {
      expect(allCalls[i].args[0]).toBe(attendeeArray[i]);
    }
  }
 
  beforeEach(function() {
    collection = Conference.attendeeCollection();
    callbackSpy = jasmine.createSpy();
  });
 
  it(‘빈 컬렉션에서는 콜백을 실행하지 않는다’, function() {
    collection.iterate(callbackSpy);
    expect(callbackSpy).not.toHaveBeenCalled();
  });
 
  it(‘원소가 하나뿐인 컬렉션은 콜백을 한 번만 실행한다’, function() {
    var attendees = [
      Conference.attendee(‘윤지’, ‘김’)
    ];
    addAttendeesToCollection(attendees);
 
    collection.iterate(callbackSpy);
 
    verifyCallbackWasExecutedForEachAttendee(attendees);
  });
 
  it(‘컬렉션 원소마다 한 번씩 콜백을 실행한다’, function() {
    var attendees = [
      Conference.attendee(‘Tom’, ‘Kazansky’),
      Conference.attendee(‘Charlotte’, ‘Blackwood’),
      Conference.attendee(‘태영’, ‘김’)
    ];
    addAttendeesToCollection(attendees);
 
    collection.iterate(callbackSpy);
 
    verifyCallbackWasExecutedForEachAttendee(attendees);
  });
});
});

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