django
  • unit-testing
  • mocking
  • 2010-12-15 5 views 0 likes 
    0

    이 함수를 가지고 있습니다 :템플릿 경로를 제공하지 않고 get_template을 사용하는이 함수를 테스트하는 방법은 무엇입니까?

    def _render(object, template, context_name=None, classes=None): 
    """ 
    Helper function that execute the form/field actual rendering. 
    
    """ 
    if not context_name: 
        context_name = 'object' 
    template = get_template(template) 
    c = { 
        context_name: object, 
        'classes': classes, 
    } 
    return template.render(Context(c)) 
    

    테스트하고 싶지만 파일 시스템에 기존의 템플릿을 제공하는 것을 원하지 않습니다. input_chunk :

    class RenderCustomChunk(TestCase): 
    """ 
    The ``_render()`` class should return a fully rendered html code 
    based on the given template chunk and parameters passed 
    with the rendering function ie. classes. 
    
    """ 
    def setUp(self): 
        self.test_object = 'Test Object' 
        self.test_template_name = 'TestTemplate.html' 
    
        self.input_chunk = u'<p>{{ object }}</p>' 
        self.render_output = u'<p>%s</p>' % self.test_object 
    
    def test_should_render_custom_object(self): 
        self.assertEqual(forms._render(self.test_object, self.test_template_name), 
            self.render_output) 
    

    그렇게 할 수있는 우아한 방법이 있습니까?

    답변

    0

    get_template 함수 (get_template이 아닌 "가상"파일을 사용하고 있습니다)를 테스트하려고 생각하지 않았으므로 다른 해결책은 get_template을 조롱하는 것입니다.

    # tests.py 
    from foo import forms 
    
    def mock_get_template(): 
        return django.template.Template(u'<p>{{ object }}</p>') 
    
    forms.get_template = mock_get_template 
    

    또는 인라인는 설정에서 청소기 보이는 경우()

    단지 책임을 밀어하고 아직도 내가 대신 템플릿 인스턴스의 템플릿 경로 기능 사용을 테스트 할 수 없습니다
    class RenderCustomChunk(TestCase): 
        def setUp(self): 
         self.test_object = 'Test Object' 
         self.test_template_name = 'TestTemplate.html' 
    
         self.render_output = u'<p>%s</p>' % self.test_object 
    
         # this is a unit test for _render, not get_template. 
         forms.get_template = lambda x: Template(u'<p>{{ object }}</p>') 
    
        def test_should_render_custom_object(self): 
         self.assertEqual(forms._render(self.test_object, self.test_template_name), 
             self.render_output) 
    
    +0

    , 그래서이 해결책을위한 "no go". 나는이 도우미에서 get_template을 제거하는 것을 포함하여 많은 해결책을 생각했다. 하지만 나는 우아한, 아마도 모의 관련 하나를 찾고 있는데 - 그 이유는 질문을 올렸습니다 - 나는 쉬운 것을 여기에서 찾고 있지 않습니다;) – bx2

    +0

    Roger that. 따라서 템플릿 경로로 함수를 테스트하려고합니다. get_template 기능을 테스트하거나 _render 만 테스트하려고한다는 뜻입니까? get_template은 file = open (path)을 코어에서 사용하기 때문에 "가상"파일을 사용하는 것은 불가능하다고 생각합니다. 실제 open() 대신 가상 파일 내용을 반환하려면 함수에서 일부 지점을 조롱해야합니다. _render 함수를 수정하지 않고 깨끗한 솔루션은 테스트에서 get_template 함수를 조롱하는 것일 수 있습니다. 어떻게 생각해? 예제와 함께 업데이트 : –

    +0

    당신은 이것의 바닥에 도착 했니? get_template 함수 자체를 테스트하지 않은 경우 (템플릿 로더를 통해 파일을 성공적으로 검색했는지 여부) get_template 함수를 조롱하면 문제가 해결됩니다. –

    관련 문제