Как проверить пользовательские теги шаблонов в 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.
"""
Итак, мой вопрос: вы обычно тестируете теги шаблонов, и если да, то как это сделать?
5 ответов
Это короткий отрывок из одного из моих тестовых файлов, где самообслуживание.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)
вы, ребята, на правильном пути. Можно проверить, что контекст был правильно изменен после рендеринга:
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)
хороший пример того, как тестировать теги шаблонов тест flatpage templatetags
строки могут быть отображены как шаблоны, поэтому вы можете написать тест, который включает простой "шаблон", используя ваш templatetag в качестве строки, и просто убедитесь, что он правильно отображает определенный контекст.
когда я тестировал теги шаблона, у меня был бы сам тег, возвращающий строку, содержащую текст или дикт, с которым я работал ... что-то вроде другого предложения.
поскольку теги могут изменять контекст и / или возвращать строку для отображения, я обнаружил, что быстрее всего просматривать отображаемую строку.
вместо:
return ''
есть:
return str(my_data_that_I_am_testing)
пока вы не счастливы.