在django中测试自定义模板标记过滤器

时间:2018-04-01 22:56:59

标签: django django-testing django-template-filters django-tests

sample_template.html

中使用类似的模板过滤器
{% load truck_filters %}
<div data-toggle="tooltip" data-placement="bottom" data-ten-condition='{{model.0|tenRange}}'>{{model.0}}</div>
# would render
<div data-toggle="tooltip" data-placement="bottom" data-ten-condition='0'>10</div>

我在应用中的app_filter.py文件夹中有一个templatetags

from django import template
register = template.Library()

@register.filter(name='tenRange')
def tenRange(numberString):
  # If it is blank
  if numberString == '':
    return -1
  number = int(numberString)
  lowerLimit  = 3
  mediumLimit = 5
  medium2Limit = 8
  newLimit  = 10
  if number < -1:
    return -2
  elif 0 <= number and number < lowerLimit:
    return 3
  elif lowerLimit <= number and number < mediumLimit:
    return 2
  elif mediumLimit <= number and number <= medium2Limit:
    return 1
  elif medium2Limit <= number and number <= newLimit:
    return 0
  # If above the new limit
  elif number > newLimit:
    return -1
  # If there is an error
  else:
    return -1

我如何[单位?]在test_template_tags.py文件夹的tests中测试条件(使用不同的整数,变量类型等...)?

我目前的理解有限......    我似乎无法找到一个好的工作示例,并且文档提示使用特定上下文呈现模板。我不确定是否需要,但如果是(约定),那么请您帮忙提供如何提供模板和上下文? (它是否与从视图中呈现它一样?如果是这样,你如何才能找到我试图测试的那一部分,而不会膨胀其他所需的变量来呈现?)

1 个答案:

答案 0 :(得分:2)

您可以直接测试函数本身:

from django.test import TestCase

from myproject.myapp.templatetags.app_filter import tenRange

class tenRangeTestCase(TestCase):

    def test_blank_string(self):
        result = tenRange("")
        self.assertEqual(result, -1)

    def test_input_smaller_than_minus_one(self):
        result = tenRange(-15)
        self.assertEqual(result, -2)

    # etc for your other conditions.

我认为您不需要渲染模板来测试过滤器逻辑。 Django已经有经过充分测试的模板渲染逻辑,你的过滤器的单元测试不应该担心,因为过滤器完成的“工作”不是渲染到模板,而是接受输入并返回输出