2013-10-16 2 views
2

GAE 프로젝트에서 Webapp2와 함께 Jinja2를 사용합니다.Unittest Jinja2 및 Webapp2 : 템플릿을 찾을 수 없음

class MyHandler(BaseHandler): 
    def get(self): 
     context = {'message': 'Hello, world!'} 
     self.render_response('my_template.html', **context) 

내 템플릿을 기본 위치 (templates)에 있습니다로

import webapp2 

from webapp2_extras import jinja2 


def jinja2_factory(app): 
    """Set configuration environment for Jinja.""" 
    config = {my config...} 
    j = jinja2.Jinja2(app, config=config) 
    return j 


class BaseHandler(webapp2.RequestHandler): 

    @webapp2.cached_property 
    def jinja2(self): 
     # Returns a Jinja2 renderer cached in the app registry. 
     return jinja2.get_jinja2(factory=jinja2_factory, app=self.app) 

    def render_response(self, _template, **context): 
     # Renders a template and writes the result to the response. 
     rv = self.jinja2.render_template(_template, **context) 
     self.response.write(rv) 

을 그리고보기 처리기 : webapp2_extras.jinja2에 설명으로

나는 기본 RequestHandler 있습니다.

응용 프로그램은 dev 서버에서 잘 작동하며 템플릿이 올바르게 렌더링됩니다.

하지만

import unittest 
import webapp2 
import webstest 

class MyHandlerTest(unittest.TestCase): 

    def setUp(self): 
     application = webapp2.WSGIApplication([('/', MyHandler)]) 
     self.testapp = webtest.TestApp(application) 

    def test_response(self): 
     response = application.get_response('/') 
     ... 

application.get_response('/my-view') 인상 예외로 MyHandler을 유닛 테스트 할 때 : TemplateNotFound: my_template.html.

내가 놓친 것이 있습니까? jinja2 환경 또는 템플릿 로더 구성과 비슷합니까?

답변

3

문제점 출처 : Jinja2 기본 로더는 ./templates/ 디렉토리의 파일을 검색합니다. 개발 서버에서 GAE 응용 프로그램을 실행할 때이 경로는 응용 프로그램의 루트와 관련이 있습니다. 그러나 당신이 당신의 unittests를 실행할 때이 경로는 당신의 unittest 파일에 상대적입니다.

솔루션 : 이상적인 해결책은 아니지만 여기 트릭을 사용하여 문제를 해결했습니다.

I 앱의 설정에서 설정, 동적 템플릿 경로를 추가 할 jinja2 공장을 업데이트

:

def jinja2_factory(app): 
    """Set configuration environment for Jinja.""" 
    config = {'template_path': app.config.get('templates_path', 'templates'),} 
    j = jinja2.Jinja2(app, config=config) 
    return j 

그리고 내 unittests의 설정에서 템플릿에 대한 절대 경로를 설정합니다

class MyHandlerTest(unittest.TestCase): 

    def setUp(self): 
     # Set template path for loader 
     start = os.path.dirname(__file__) 
     rel_path = os.path.join(start, '../../templates') # Path to my template 
     abs_path = os.path.realpath(rel_path) 
     application.config.update({'templates_path': abs_path}) 
+0

감사! 팩토리 기능을 포함하는 모듈/파일을 기반으로 절대 경로를 생성하여 구성에서 경로를 설정하지 않아도됩니다. 이런 식으로 이미 절대 경로를 생성하고 있습니다. 테스트 세트 업 함수에서 수행하는 것입니다. 팩토리 기능으로 수행하면 설정을 기억할 필요가 없으며 라이브 및 테스트 중일 때 모두 작동합니다. 예를 들어 :'config = { 'template_path': os.path.join (os.path.dirname (__ file__), 'templates /')}''(factory 함수를 포함하는 파일과 템플릿 dir 모두가 프로젝트). – bszom