代码之家  ›  专栏  ›  技术社区  ›  Kurt Peek

如何测试Django自定义过滤器?

  •  2
  • Kurt Peek  · 技术社区  · 8 年前

    这个问题类似于 Testing a custom Django template filter ,但与该示例不同,过滤器实际上是在 templatetags 目录,如中所述 https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/#writing-custom-template-filters . 以下是中的筛选器代码 templatetags/label_with_classes.py :

    from django import template
    
    register = template.Library()
    
    
    @register.filter(is_safe=True)
    def label_with_classes(bound_field):
        classes = f"{'active' if bound_field.value() else ''} {'invalid' if bound_field.errors else ''}"
        return bound_field.label_tag(attrs={'class': classes})
    

    这是我第一次尝试测试它:

    from ..templatetags.label_with_classes import label_with_classes
    from django.test import SimpleTestCase
    from django.template import Context, Template
    
    
    from ..forms.sessions import SessionForm
    
    
    class CustomFilterTest(SimpleTestCase):
        def test_1(self):
            form = SessionForm(data={})
            self.assertFalse(form.is_valid())
            self.assertEqual(
                form.errors,
                {'session_number': ['This field is required.'],
                 'family': ['This field is required.'],
                 'session_type': ['This field is required.']})
    
    
            template = Template('{{ form.session_number|label_with_classes }}')
            context = Context({'form': form})
    
            output = template.render(context)
    

    问题是,我收到一个错误,未找到筛选器:

    django.template.exceptions.TemplateSyntaxError: Invalid filter: 'label_with_classes'
    

    这是因为测试用例没有模拟注册过滤器并将其加载到模板中的行为。例如,在Django源代码中 https://github.com/django/django/blob/master/tests/template_tests/filter_tests/test_join.py ,有一个精心制作的 setup 为测试类提供 self.engine 谁的 render_to_string 方法已安装所需的筛选器。

    我基本上必须复制Django源代码才能为自定义过滤器编写集成风格测试吗?或者有没有更简单的方法(除了将其作为函数进行测试)?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Régis B.    8 年前

    我怀疑您需要加载模板模块:

    ...
    template = Template("""{% load label_with_classes %}
    {{ form.session_number|label_with_classes }}""")
    ...
    

    请参见 relevant documentation .