我只是在學習如何進行單元測驗,所以我確定我不了解一些核心原則。
我有自定義的 400 和 500 錯誤處理程式,它們回傳一個向用戶指示錯誤的模板。現在,在實踐中,當我運行我的網站時,這些都可以完美運行!錯誤會被捕獲,并且模板會完全按照預期生成。當我嘗試為 500 錯誤撰寫單元測驗時,困難就來了。
會發生什么:對命名空間(在本例中為“base”)的任何參考都會引發錯誤。
Traceback (most recent call last):
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/urls/base.py", line 71, in reverse
extra, resolver = resolver.namespace_dict[ns]
KeyError: 'base'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/--------/Documents/projects/--------/base/testing/test_views.py", line 50, in test_handler_renders_template_response
response = self.client.get('/500/')
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/test/client.py", line 836, in get
response = super().get(path, data=data, secure=secure, **extra)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/test/client.py", line 424, in get
return self.generic(
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/test/client.py", line 541, in generic
return self.request(**r)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/test/client.py", line 805, in request
response = self.handler(environ)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/test/client.py", line 153, in __call__
response = self.get_response(request)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/sentry_sdk/integrations/django/__init__.py", line 409, in sentry_patched_get_response
rv = old_get_response(self, request)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/core/handlers/base.py", line 140, in get_response
response = self._middleware_chain(request)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/core/handlers/exception.py", line 57, in inner
response = response_for_exception(request, exc)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/core/handlers/exception.py", line 140, in response_for_exception
response = handle_uncaught_exception(
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/core/handlers/exception.py", line 185, in handle_uncaught_exception
return callback(request)
File "/home/--------/Documents/projects/--------/base/views.py", line 22, in handler500
render(request, 'base/html/templates/500.html')
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/sentry_sdk/integrations/django/templates.py", line 95, in render
return real_render(request, template_name, context, *args, **kwargs)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/shortcuts.py", line 24, in render
content = loader.render_to_string(template_name, context, request, using=using)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/loader.py", line 62, in render_to_string
return template.render(context, request)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/backends/django.py", line 62, in render
return self.template.render(context)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/base.py", line 175, in render
return self._render(context)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/test/utils.py", line 111, in instrumented_test_render
return self.nodelist.render(context)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
return self.render(context)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 157, in render
return compiled_parent._render(context)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/test/utils.py", line 111, in instrumented_test_render
return self.nodelist.render(context)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
return self.render(context)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/loader_tags.py", line 208, in render
return template.render(context)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/base.py", line 177, in render
return self._render(context)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/test/utils.py", line 111, in instrumented_test_render
return self.nodelist.render(context)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in render
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/base.py", line 1005, in <listcomp>
return SafeString("".join([node.render_annotated(context) for node in self]))
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/base.py", line 966, in render_annotated
return self.render(context)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/template/defaulttags.py", line 472, in render
url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
File "/home/--------/Documents/projects/--------/venv/lib/python3.10/site-packages/django/urls/base.py", line 82, in reverse
raise NoReverseMatch("%s is not a registered namespace" % key)
django.urls.exceptions.NoReverseMatch: 'base' is not a registered namespace
這是模板:
{% 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 %}在模板中而收到這些命名空間錯誤。
uj5u.com熱心網友回復:
urlpatterns= [...]您可以通過在測驗腳本中定義自己的來覆寫您的應用程式 urls.py。這意味著您通常的命名空間資訊不可用。在這種情況下,urlpatterns.append(...)可能會更好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/527328.html
上一篇:為什么看起來幾乎相同的部分和完整C 模板特化會產生不同的結果?
下一篇:如何嵌套組合一堆函式?
