此问题类似于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源代码来为我的自定义过滤器编写集成式测试吗?或者是否有更简单的方法(除了将其作为函数进行测试)?
答案 0 :(得分:2)
我怀疑你需要加载模板模块:
...
template = Template("""{% load label_with_classes %}
{{ form.session_number|label_with_classes }}""")
...