gpt4 book ai didi

django - 自升级到 Django 4.0 以来, View 名称测试失败

转载 作者:行者123 更新时间:2023-12-05 03:33:09 26 4
gpt4 key购买 nike

在 Django 项目中,我进行了测试,检查 URL 是否使用特定的基于类的 View 。例如我有这样的看法:

from django.views.generic import TemplateView

class HomeView(TemplateView):
template_name = "home.html"

这个测试:

from django.test import TestCase
from django.urls import resolve
from myapp import views

class UrlsTestCase(TestCase):

def test_home_view(self):
self.assertEqual(resolve("/").func.__name__, views.HomeView.__name__)

此测试在 Django 3.x 中通过,但一旦我在 Django 4.0 中尝试,测试失败:

self.assertEqual(resolve("/").func.__name__, views.HomeView.__name__)
AssertionError: 'view' != 'HomeView'
- view
+ HomeView

显然 Django 4.0 中有些东西发生了变化,但我在 the release notes 中看不到任何相关内容.

那么,发生了什么变化,我怎样才能让这个测试再次工作(或者我怎样才能以更好的方式测试它)?

最佳答案

您使用 .as_view() ,因此它返回一个类对象,而是一个函数,该函数将通过创建一个新的 HomeView 来处理请求。并根据HTTP方法触发相应的方法。

您可以检查它是否是 HomeView 的方法通过检查 .view_class属性。此外,最好检查这两个类是否相同,而不是检查这些类的名称:

#                                            ↓ no .__name__  ↓
self.assertEqual(resolve('/').func.<strong>view_class</strong>, views.HomeView)

我做了一些研究,为什么要比较 __name__它不再有效。显然在 他们使用了 update_wrapper(…) function这设置了 __name__ , __qualname__等一个对象(在本例中为类)到函数。事实上,在 source code [GitHub] ,我们可以看到:

@classonlymethod
def as_view(cls, **initkwargs):
# …
def view(request, *args, **kwargs):
# …
# …

# take <strong>name and docstring from class</strong>
<strong>update_wrapper(</strong>view, cls, updated=()<strong>)</strong>
# …

这已在 中更改他们还在 a comment why they do no longer do that [GitHub] 中进行了解释:

@classonlymethod
def as_view(cls, **initkwargs):
# …
# <strong>__name__ and __qualname__ are intentionally left unchanged</strong> as
# view_class should be used to robustly determine the name of the view
# instead.
# …

关于django - 自升级到 Django 4.0 以来, View 名称测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70366690/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com