在 Django 中测试自定义模板标签过滤器

test a custom template tag filter in django

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>

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

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

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

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

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

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 已经有了 well-tested 模板渲染逻辑,你的过滤器的 unit-tests 不必担心,因为你的过滤器完成的 "job" 不是渲染到模板,而是接受输入并 return 输出。