2017-11-15 3 views
1

를 호출하지에도 불구하고 단위 테스트에서 실행되는 m 결코을 호출하면 NgLifecycleLog() 메서드가 호출되고 호출됩니다. 이는 console 문 대신 LoggerFactory을 사용하려고하기 때문에 문제입니다. 단위 테스트를 실행하면 NgLifecycleLog()에 대한 호출이 이루어 지므로 LoggerFactory의 인스턴스가 예상치 못한 경우 생성됩니다.수출 기능은 내가 다음과 같은 클래스가 결코

왜 이것이 호출됩니까? 나는이 테스트가 실행되고있는 유일한 방법인지 확인하기 위해 테스트에서 fdescribe을 시도했다.

+0

:

const lifecycleLogger = LoggerFactory.getLogger(NAME); LIFECYCLE_HOOKS.forEach(hook => { const original = constructor.prototype[hook]; constructor.prototype[hook] = function(...args) { lifecycleLogger.info('${hook}', ...args); original.apply(this, args); }; }); 

lifecycleLogger가 실제로 사용되는이 장소에 클래스 장식에 호출되는 곳에서 이동해야합니다 이름이 불려서 전화 했어. 뭔가 꾸미기 위해이 데코레이터를 만들었지, 그렇지? 사용하지 않는다면 왜 그곳에 있습니까? 코드베이스에서 삭제하면 호출 된 곳을 볼 수 있습니다. – estus

+0

예, 부품에서 사용합니다. 하지만 구성 요소를 테스트하지는 않습니다. 유닛 테스트를 실행하고'fdescribe'를하면 컴포넌트는 결코 그 데코레이터를 사용할 기회를 갖지 않아야합니다. 단위 테스트를 실행하고 그 단위 테스트가 ** 그것을 부르지 않는다면 왜 호출 될까요? – Nxt3

+1

장식품이 어떻게 작동하는지 오해 한 것 같습니다. 클래스 데코레이터는 데코 레이팅 된 클래스가 정의 될 때 한 번 실행됩니다. 테스트 클래스에 꾸며진 클래스가 포함되면 데코레이터 함수가 호출됩니다. 이것이 문제를 만든다면 데코레이터가 잘못된 방향으로 설계되었습니다. 나는 당신의 실제 코드뿐만 아니라 console.error를 반영하도록 질문을 업데이트 할 것을 제안합니다. – estus

답변

1

데코 레이팅 클래스가 정의되면 클래스 데코레이터는 한 번 실행됩니다. 장식 클래스가 테스트 번들에 포함되면 데코레이터 함수가 호출됩니다.

장식 자 함수가 부작용을 일으키거나 다른 단위를 포함하는 경우 (단위 테스트에 영향을 줄 수 있음) 리팩터링해야합니다.

이 경우

에게 장식 패치 클래스 프로토 타입 방법 :

LIFECYCLE_HOOKS.forEach(hook => { 
    const original = constructor.prototype[hook]; 

    constructor.prototype[hook] = function(...args) { 
    const lifecycleLogger = LoggerFactory.getLogger(NAME); 
    lifecycleLogger.info(`${hook}`, ...args); 
    original.apply(this, args); 
    }; 
}); 
+0

그걸 고쳤습니다. 고맙습니다! – Nxt3

+1

당신을 진심으로 환영합니다. 또한 LoggerFactory.getLogger (NAME) 호출은 필요에 따라 memoized 또는 로컬 변수에 캐싱 될 수 있지만 Logger.get (js-logger lib)가 이미 그렇게하기 때문에 그렇지 않은 것처럼 보입니다. – estus

관련 문제