더북(TheBook)

우선 Targetnew로 생성할 당시의 값이 this인지 확인하는 기대식을 타깃 함수에 넣었다. 하지만 호출 자체가 실패하면 expect(this).toBe(self)까지 가지도 못하니 테스트는 마치 성공한 것처럼 보일 수 있다. 이 점을 보완하려면 함수가 호출되었음을 확인하는 기대식으로 결론을 내려야 한다.

두 번째 테스트도 비슷하지만, 그런 경고가 없다. 재스민이 에러를 보고한다. 빈 객체로 지정했던 기존 targetContextthis로 바꾸면 바로 해결된다(예제 2-37).

예제 2-37 올바른 콘텍스트에서 타깃을 실행

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

Aop = {
around: function(fnName, advice, fnObj) {
  var originalFn = fnObj[fnName];
  fnObj[fnName] = function () {
    return advice.call(this, {fn:originalFn, args:arguments});
  };
}
};

테스트는 성공이다.

주의해야 할 부분이 있다. 예제 2-32에서 체인의 다음 어드바이스(더는 어드바이스가 없다면 장식된 함수(decorated function))를 호출하려면 다음 코드처럼 할 수밖에 없었다.

targetInfo.fn.apply(this, targetInfo.args);

 

하지만 최선은 아니다. 타이핑할 코드도 많을뿐더러 무엇보다 targetInfo의 구조를 Aop 사용자에게 보여주는 꼴이다. 함수 안에 캡슐화하는 편이 낫지 않을까? 프레드릭과 데이브는 도우미 함수 Aop.next를 만들어 체인의 다음 애스팩트/타깃을 호출할 수 있게 만들었다.

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