38

我正在向 Django 应用程序添加一组模板标签,但我不确定如何测试它们。我在我的模板中使用了它们,它们似乎正在工作,但我正在寻找更正式的东西。主要逻辑在模型/模型管理器中完成并且已经过测试。标签只是检索数据并将其存储在上下文变量中,例如

{% views_for_object widget as views %}
"""
Retrieves the number of views and stores them in a context variable.
"""
# or
{% most_viewed_for_model main.model_name as viewed_models %}
"""
Retrieves the ViewTrackers for the most viewed instances of the given model.
"""

所以我的问题是你通常会测试你的模板标签吗?如果你这样做了,你是怎么做的?

4

5 回答 5

38

这是我的一个测试文件的一小段,其中 self.render_template 的 TestCase 中一个简单的辅助方法是:

    rendered = self.render_template(
        '{% load templatequery %}'
        '{% displayquery django_templatequery.KeyValue all() with "list.html" %}'
    )
    self.assertEqual(rendered,"foo=0\nbar=50\nspam=100\negg=200\n")

    self.assertRaises(
        template.TemplateSyntaxError,
        self.render_template,
        '{% load templatequery %}'
        '{% displayquery django_templatequery.KeyValue all() notwith "list.html" %}'
    )

它非常基础,使用黑盒测试。它只是将一个字符串作为模板源,渲染它并检查输出是否等于预期的字符串。

render_template方法非常简单:

from django.template import Context, Template

class MyTest(TestCase):
    def render_template(self, string, context=None):
        context = context or {}
        context = Context(context)
        return Template(string).render(context)
于 2009-11-06T22:22:08.740 回答
22

你们让我走上了正轨。可以检查渲染后上下文是否正确更改:

class TemplateTagsTestCase(unittest.TestCase):        
    def setUp(self):    
        self.obj = TestObject.objects.create(title='Obj a')

    def testViewsForOjbect(self):
        ViewTracker.add_view_for(self.obj)
        t = Template('{% load my_tags %}{% views_for_object obj as views %}')
        c = Context({"obj": self.obj})
        t.render(c)
        self.assertEqual(c['views'], 1)
于 2009-11-06T20:13:50.000 回答
10

一个很好的例子,说明如何测试模板标签test of flatpage templatetags

于 2011-10-12T14:20:32.857 回答
0

当我测试我的模板标签时,我会让标签本身返回一个包含我正在使用的文本或字典的字符串......有点像其他建议的行。

由于标签可以修改上下文和/或返回要呈现的字符串——我发现仅查看呈现的字符串是最快的。

代替:

return ''

有它:

return str(my_data_that_I_am_testing)

直到你开心为止。

于 2009-11-06T16:35:29.230 回答
0

字符串可以呈现为模板,因此您可以编写一个包含简单“模板”的测试,使用您的模板标签作为字符串,并确保它在给定特定上下文的情况下正确呈现。

于 2009-11-06T14:41:50.330 回答