Django: ссылка на пространство имен в шаблоне во время модульного теста выдает ошибку "не зарегистрировано пространство имен"
Я только учусь юнит-тестированию, поэтому я уверен, что не понимаю некоторых основных принципов.
У меня есть пользовательские обработчики ошибок 400 и 500, которые возвращают пользователю шаблон с указанием ошибки. Теперь, на практике, когда я запускаю свой сайт, они работают идеально! Ошибки отлавливаются, и шаблоны генерируются точно так, как ожидалось. Сложность возникает, когда я пытаюсь написать модульные тесты для 500-й ошибки.
Что происходит: любые ссылки на пространство имен (в данном случае 'base') приводят к ошибке.
Вот шаблон:
{% extends 'base/html/templates/base.html' %}
{% load static %}
{% block body %}
<div class="alert alert-warning">
<h4 class="alert-heading">500 Error: Server error</h4>
<p>
Something generated an error that couldn't be fixed. If you want, email me at <email address> and let me know what happened.
</p>
</div>
{% endblock body %}
Вот модульный тест:
from django.test import SimpleTestCase, override_settings
from django.urls import reverse
from project.settings import ROOT_URLCONF
from django.urls import path
from django.shortcuts import render
from ..views import handler500
def raise_500(request):
return 1/0
urlpatterns = [
path('500/', raise_500),
]
handler500 = handler500
@override_settings(ROOT_URLCONF=__name__)
class Test_500(SimpleTestCase):
def test_handler_renders_template_response(self):
self.client.raise_request_exception = False
response = self.client.get('/500/')
self.assertEqual(response.status_code, 500)
self.assertTemplateUsed('base/html/templates/500.html')
Если я убираю тег {% extends %}
из шаблона, модульный тест проходит! На самом деле, все теги шаблона работают, кроме тех, которые ссылаются на "пространство имен"; поэтому ни теги {% extends %}
, ни {% url %}
не работают, но {% static %}, {% block %} и т.д. отображаются, как и ожидалось.
Я не совсем понимаю, что происходит. Честно говоря, это не очень большая проблема: для выполнения модульного теста я просто использую статическую страницу 500 с одной жестко закодированной ссылкой на '/', и все в порядке. Но в попытке научиться правильно тестировать мне интересно, почему я получаю эти ошибки пространства имен только потому, что я использовал {% extends %}
или {% url %}
в шаблоне.
Вы можете переопределять urls.py вашего приложения, определяя свои собственные urlpatterns= [...]
в тестовом сценарии. Это означает, что ваша обычная информация о пространстве имен недоступна. В этом случае urlpatterns += [...]
может работать лучше.