2017-09-15 7 views
1

전역 변수를 모의 해보고 내 함수에서 호출되었는지 테스트하고 싶습니다. 내 파일에서 Subject (RxJS 라이브러리)를 초기화하는 전역 변수 "remote"를 정의합니다. 필자는 Subject의 다음 함수가 올바른 매개 변수 "name"을 사용하여 호출되었는지 테스트하려고합니다. 그러나 테스트 파일에서 전역 변수 remote에 액세스 할 수 없습니다. 설치 파일에서 조롱하려고했지만 작동하지 않습니다.Jest로 단위 테스트에서 전역 상수에 액세스하는 방법?

어떻게하면됩니까?

const remote = new Subject(); 
const analytics = { 
    click: (name) => { 
    if (name) { 
     remote.next(name); 
    } 
    } 
} 
module.exports = analytics; 

고마워요!

+0

나는 webpack을 사용하고 있으며,'remote'는 전역 변수가 아닙니다. – Zen

+0

안녕하세요 @ 대답 감사합니다. 네, 웹팩을 사용하고 있습니다. Jest는 새로운 Subject의 속성 "next"를 알지 못한다고 말하고 있습니다 (관찰 가능에 대해 조금 아는 경우 다음은 Subject 클래스의 고전적인 메서드입니다). Jest에게 "원격"변수에 대해 알릴 수있는 방법에 대해 알고 싶습니다. – Megan

답변

1

좋은 질문입니다. webpack을 사용하면 개별 파일이 다른 함수 호출로 래핑됩니다. 이 doc을 확인하십시오.
이 질문의 가장 중요한 부분은 코드를 테스트 할 수있게하려면 IOC/DI의 필요성을 보여주는 것입니다. 로컬 모듈에 remote을 정의하는 대신 Analytics 클래스를 내 보낸 다음 remote을 해당 생성자에 삽입 할 수 있습니다.

// Analytics.js 
export default class Analytics{ 
    constructor(remote) { 
    this.remote = remote 
    } 

    click(name) { 
    if (name) { 
     this.remote.next(name) 
    } 
    } 
} 

main.js 
import Analytics from './Analytics' 

const remote = new Subject() 
const analytics = new Analytics(remote) 
analysis.click('foo') 

모든 구성 요소/서비스에 종속성을 주입하는 것은 지루할 수 있습니다. Angular는 이유/방법을 간소화하기 위해 an decent doc입니다. 희망이 도움이됩니다!

// 업데이트
당신이 원격 조롱 그것의 참조가 아닌 속성을 수정 기억하고 싶은 때 window.remote

const remote = new Subject() 
window.remote = remote 

를 사용하여 테스트에서 글로벌 상수 및 액세스를 정의하는 창을 사용할 수 있습니다 .

// test.js 
beforeEach(() => { 
    // wrong !!! 
    window.remote = { 
     next(name) { assert(name) } 
    } 

    // right 
    window.remote.next = name => assert(name) 
}) 
+0

고마워요! 의사 NodeJS는 매우 유용합니다. 나는이 해결책이 최선일 것이라는 점에 동의한다; 그러나 레거시 코드로 작업하는 Im은 리팩토링 할 수 없습니다 ... 어쨌든 어떻게 테스트 할 수 있는지 생각해보십시오. – Megan

+0

답변을 업데이트했습니다. @Megan을 확인하십시오 – Zen

+0

감사합니다 @ 젠, 임 체크 아웃 할거야! – Megan