2010-12-15 27 views
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)) 

我要测试,但我不想提供我的文件系统中的任何现有的模板只是一个“虚拟”一个像IE。 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

,这将只是把责任推和我还是不能够测试函数的用法与模板路径,而不是模板实例,所以这个解决方案“不要去”。我想过很多解决方案,包括从这个帮手中剥离get_template。但我正在寻找一个优雅的,也许是模拟相关的 - 这就是为什么我发布了一个问题 - 我不在这里寻找容易的东西;) – bx2 2010-12-15 19:06:12

+0

罗杰说。所以你想用模板路径来测试函数。这是否意味着您想要测试get_template功能还是仅仅_render? get_template在其核心使用file = open(path),所以我认为使用“虚拟”文件是不可能的。你必须嘲笑函数中的某个点来返回你的虚拟文件内容,而不是真正的open()。没有修改_render函数的清洁解决方案可能是模拟测试中的get_template函数。你怎么看?更新与示例:) – 2010-12-17 00:24:45

+0

你有没有达到这个底部?如果您不是测试get_template函数本身(无论它是否通过模板加载器成功检索文件),那么嘲笑get_template函数应该可以解决您的问题。 – 2010-12-22 08:44:17

相关问题