2012-01-16 4 views
1

나는 브라우저를 대상으로하는 앱을 작성하고 있으며, 내 라이브러리 코드에 대한 자동화 된 테스트를 작성하려고한다. Node과 같은 명령 줄 환경에서 브라우저 외부에서 테스트를 실행하고 싶습니다. Mocha 또는 Jasmine과 같은 BDD 프레임 워크를 사용하고 있지만 아직 테스트 프레임 워크를 선택하지 않았습니다.로드하기 전에 노드 모듈에 전역을 삽입 할 수 있습니까?

내 코드는 Knockout의 관찰 가능한 속성에 따라 다릅니다. 안타깝게도 Knockout 라이브러리에는 관찰 가능한 속성뿐만 아니라 DOM에 바인딩하는 코드도 포함되어 있습니다. 따라서 노드에서 넉 아웃 라이브러리 require()을 시도해 보면 라이브러리가 노드에서 정의되지 않은 변수 window, navigatordocument을 참조하려고하기 때문에 오류가 발생합니다. Knockout은 실제로 이러한 변수 중 하나를 사용하지 않습니다. 많은 - DOM 바인딩에 대한 기능 감지는 대부분 내게 중요하지 않지만 기능을 사용하기 때문에 노드가로드되지 않습니다. 파일.

그래서 여기 내 질문 : 로드 할 때 모듈에 더미 변수를 삽입 할 수 있습니까? "소스 파일을로드 한 후 실행하기 전에 코드가 성공적으로 실행될 수 있도록 모듈 내부에 몇 개의 변수를 설정해 주겠습니까?"라고 말할 수 있습니까?

이미 CoffeeScript이 노드의 모듈 로더를 패치하므로 .coffee 파일을로드 할 수 있습니다. .js; 그래서 내가 어떻게 만 알았더라도, 변수를 주입하기 위해 그것을 패치 할 수있는 방법이있는 것처럼 보입니다.

답변

2

예, 가능합니다. 생성 한 다음 사용할 수 있습니다. 전역에는 격리가 없습니다.

또는 shim을 코드 주위에 텍스트로 둘러 싸서 클로저 안에 제공하고자 할 수 있습니다. jsdom은 jQuery를 실행하기 위해 이와 같은 작업을 수행합니다. (그리고 실제 DOM을 제공합니다!)

+1

D' 오! 맞습니다. JavaScript에서는 Knockout에서'require()'를 호출하기 전에'window = {};'와 같은 것을 할 수 있습니다. 하지만 CoffeeScript를 사용하고 있습니다. 기본적으로 익명의 함수로 모든 것을 래핑하므로 전역 변수가 모든 것을 흘리지 않으므로 대신 global.window를 설정해야합니다. 찾는 대상이 있다는 것을 알게되면, 올바른 방향으로 나를 가리켜 주셔서 감사합니다. (그리고 jsdom을 지적 해 주셔서 고마워요. 저도 역시 도움이 될 것입니다!) –

0

Node.js는 일반적으로 사용되는 의미에서 헤드리스 환경이 아닙니다 (머리가없는 브라우저).

jsdom을 사용하면 더 나아갈 수 있지만 DOM과 all이 포함 된 머리가없는 웹킷 인 PhantomJS을 살펴보고 사용 사례에 완벽하게 부합해야합니다.

+0

PhantomJS를 조금 보았습니다 만, 테스트 러너 지원은 어색하고 (DOM 스크래핑), 테스트는 '