Подтвердить что ты не робот

Как протестировать пользовательские теги шаблонов в Django?

Я добавляю набор тегов шаблонов к приложению 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.
"""

Итак, мой вопрос в том, что вы обычно тестируете свои теги шаблонов, и если вы это сделаете, то как это сделать?

4b9b3361

Ответ 1

Это короткий отрывок из одного из моих тестовых файлов, где 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" %}'
    )

Он очень простой и использует тестирование Blackbox. Он просто берет строку в качестве источника шаблона, отображает ее и проверяет, соответствует ли результат ожидаемой строке.

Метод 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)

Ответ 2

Вы, ребята, меня на правильном пути. Можно проверить, что контекст был правильно изменен после рендера:

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)

Ответ 4

Строки могут отображаться как шаблоны, поэтому вы можете написать тест, который включает простой "шаблон", используя ваш templatetag в виде строки, и просто убедитесь, что он корректно отображает определенный контекст.

Ответ 5

Когда я тестировал свои теги шаблона, я бы сам сам возвращал строку, содержащую текст или dict, с которыми я работал... вроде строк другого предложения.

Так как теги могут изменять контекст и/или возвращать строку, которую нужно отобразить, я обнаружил, что быстрее всего просматривать отображаемую строку.

Вместо:

return ''

У него:

return str(my_data_that_I_am_testing)

Пока вы не счастливы.