Skip to main content
 首页 » 编程设计

python之如何测试 Django 自定义过滤器

2024年09月07日33kerrycode

这个问题类似于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 源代码才能为我的自定义过滤器编写集成式测试吗?或者是否有更简单的方法(除了将其作为函数进行测试之外)?

请您参考如下方法:

我怀疑你需要加载你的模板模块:

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

参见 relevant documentation .