더북(TheBook)

전에 쓴 코드를 편집기에서 복사해 타깃 객체를 새로 만들어도 되지만, 그러면 타깃 객체 하나를 두 테스트가 함께 쓰는 모양새다. 앞서 살펴봤듯이 타깃 객체는 외부 describe 스코프에 있어야 모든 테스트가 참조할 수 있다. 약간 귀찮지만, 나중에 테스트할 때 아주 요긴하다.

테스트가 끝나면 타깃이 수정되므로 각 테스트 실행 전에 beforeEach에서 타깃을 다시 초기화한다(예제 2-29).

현재 구현된 Aop.around는 (타깃 함수를 가리키는) fn 프로퍼티를 지닌 객체를 제공하는 로직이 없다. 따라서 테스트는 당연히 실패다. 기능을 새로 구현하자(예제 2-30).

예제 2-30 애스팩트가 타깃을 호출

소스 파일 2장\AOP\Aop_02.js

Aop = {
around: function(fnName, advice, fnObj) {
  var originalFn = fnObj[fnName];
  fnObj[fnName] = function () {
    var targetContext = {}; // 잘못된 코드라는 건 알고 있다. 나중에 다시 설명한다.
    advice.call(targetContext, {fn:originalFn});
  };
}
};

여기서 두 가지를 주목하자. 첫째, C#/자바 호출과 흡사한 call 메서드다. 이 메서드는 두 번째 이후 파라미터(예제에는 {fn: originalFn} 하나밖에 없지만, 더 나열할 수 있다)를 인자로 넘겨 함수(advice)를 호출한다. 첫 번째 파라미터는 함수를 호출한 지점의 콘텍스트("this")다. 중요한 개념이지만, 콘텍스트가 주인공인 테스트는 아직 없으니까 일단 빈 객체를 자리 끼움(placeholder) 용도로 쓰자.

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