2014-12-09 11 views
0

저는 YUI3에서 클라이언트 측 테스트를 만들고 테스트중인 페이지의 핸들 막대 템플릿을 컴파일해야합니다.단위 테스트 용 핸들 막대 템플릿

우리는 렌더링 엔진으로 hbs가 설정된 노드 응용 프로그램을 실행 중이므로 요청이 서버에 도착하면 라우터는 res.render()를 호출하고 views 디렉토리의 .hbs 파일을 직접 호출하여 응답합니다 .

테스트에서 내가 핸들 바 템플릿을 인스턴스화하고 DOM에 할당해야하지만 테스트는 자바 스크립트이므로 파일 스트림 기능에 액세스 할 수 없으며 handlebars.compile()은 경로를 사용하지 않습니다. 논증.

기본적으로이 같은 뭔가를 원하지만 어디 Handlebars.compile() 메소드가 연속적으로 참조 된 템플릿 파일을 컴파일합니다

var body = A.one(document.body); 
var container = A.Node.create('<div id="test-container"></div>'); 
var domTemplate = Handlebars.compile('../../../../views/campaign/set-campaign-properties.hbs'); 
var dom = A.Node.create(domTemplate); 
container.append(dom); 
body.append(container); 

답변

0

클라이언트와 사이에 큰 차연이 있음을 명심를 서버에서, 당신은 몇 가지 이상한 문제를 일으킬 수있는 서버의 클라이언트 측 항목을 테스트하도록 요청하고 있지만 도움이되는 좋은 도구가 있습니다. 일반적으로 유닛 테스트에서 템플릿 렌더링을 수행 할 때 phantomjs 나 selenium과 같은 것을 사용합니다. 그러나 jsdom 또는 jest를 사용하여 서버 측에서 dom을 구문 분석 할 수 있습니다.

내가 jsdom와 샘플을 일한

, http://runnable.com/me/VIZN1VmFRzsBJu8r

var Handlebars = require("handlebars") 
var source = "<p>Hello, my name is {{name}}. I am from {{hometown}}. I have " + 
      "{{kids.length}} kids:</p>" + 
      "<ul>{{#kids}}<li>{{name}} is {{age}}</li>{{/kids}}</ul>"; 
var template = Handlebars.compile(source); 

var data = { "name": "Alan", "hometown": "Somewhere, TX", 
      "kids": [{"name": "Jimmy", "age": "12"}, {"name": "Sally", "age": "4"}]}; 
var templateResult = template(data); 

var jsdom = require("jsdom"); 

jsdom.env(
    templateResult, 
    ["http://code.jquery.com/jquery.js"], 
    function (errors, window) { 
    console.log("contents of p tag:", window.$("p").text()); 
    } 
); 
+0

감사의 응답 JE,하지만 내 문제는 내가는 HBS 파일에서 핸들 템플릿을 컴파일 할 필요가있다. 'source'의 템플릿을 다른 디렉토리의 파일에서 템플릿으로 대체하는 방법은 무엇입니까? –

+0

서버 대 클라이언트 때문에 약간 문제가 있습니다. 서버에서로드하는 방법은 파일을 문자열로 읽고 여기에서했던 방법과 비슷하게로드하는 것입니다. 클라이언트 측에서는 ajax를 통해 파일을로드합니다. 몇 가지 도서관이 있습니다. 저는 CommonJS 패턴을 사용하는 webpack을 사용하여 서버와 클라이언트 모두에서 객체를로드하는 것을 처리했습니다. 좀 더 완전한 데모를 추가하겠습니다. – JustEngland

+0

감사합니다. 원래 질문을 되돌아 보면, 나는 유스 케이스에 대해 명확하지 않다는 것을 알았다. 프로덕션 중에 Express 엔진 render() 메소드에서 호출 한 .hbs 템플릿 내에 핸들 막대 템플릿이 있습니다. 여기에 필자의 필요성은 시야에 대한 테스트를 작성하는 것과 관련이있다. 이렇게하려면 뷰와 컨트롤러를 인스턴스화해야합니다. 문제는 DOM에 여러 개의 후크가 있기 때문에 컨트롤러에서 오류가 발생하고 테스트 중에 핸들 막대 템플릿 파일을 호출하고 렌더링 할 수 없어 DOM을 인스턴스화 할 수 없다는 것입니다. 그게 더 명확한가요? –