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 += [...] может работать лучше.

Вернуться на верх