You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何针对类视图使用assertEqual(resolve())?Django URL测试报错求助

Django类视图URL解析测试问题解决方法

问题重现

测试类视图URL解析时出现断言错误,相关信息如下:

初始错误信息

self.assertEqual(resolve(url).func, BookList.name)
AssertionError: <function View.as_view..view at 0x0000025699398360> != 'BookList'

相关代码

views.py

class BookList(generics.ListAPIView):
    """Retrive book list"""
    queryset = models.Book.objects.all()
    serializer_class = book_serializer.BookSerializer

urls.py

path('', views.BookList.as_view(), name='book-list'),

初始测试代码(test.py)

from django.test import SimpleTestCase
from django.urls import reverse, resolve
from book.views import BookList

class TestUrls(SimpleTestCase):
    def test_list_url_is_resolved(self):
        url = reverse('book-list')
        print(resolve(url))
        self.assertEqual(resolve(url).func, BookList.__name__)

尝试过的错误写法及对应报错

  1. 写法一:
class TestUrls(SimpleTestCase):
    def test_list_url_is_resolved(self):
        url = reverse('book-list')
        print(resolve(url))
        self.assertEqual(resolve(url).func.__name__, BookList.as_view())

报错:

self.assertEqual(resolve(url).func.name, BookList.as_view())
AssertionError: 'view' != <function View.as_view..view at 0x000001FA9E7320C0>

  1. 写法二:
def test_list_url_is_resolved(self):
        url = reverse('book-list')
        print(resolve(url))
        self.assertEqual(resolve(url).func, BookList.as_view())

报错:

self.assertEqual(resolve(url).func, BookList.as_view())
AssertionError: <function View.as_view..view at 0x000002C666D48360> != <function View.as_view..view at 0x000002C666D120C0>

正确测试方法

有两种可靠的方式验证类视图URL解析:

方法一:直接验证视图类

as_view()生成的包装函数带有view_class属性,指向原类视图,直接对比即可:

from django.test import SimpleTestCase
from django.urls import reverse, resolve
from book.views import BookList

class TestUrls(SimpleTestCase):
    def test_list_url_is_resolved(self):
        url = reverse('book-list')
        self.assertEqual(resolve(url).func.view_class, BookList)

方法二:验证类名称字符串

如果需要对比类名字符串,取func.view_class.__name__与类名对比:

from django.test import SimpleTestCase
from django.urls import reverse, resolve
from book.views import BookList

class TestUrls(SimpleTestCase):
    def test_list_url_is_resolved(self):
        url = reverse('book-list')
        self.assertEqual(resolve(url).func.view_class.__name__, BookList.__name__)

错误原因分析

  • 初始错误:resolve(url).func是as_view()生成的包装函数对象,BookList.__name__是字符串,类型不匹配无法相等。
  • 写法一错误:将函数名字符串与as_view()生成的函数对象对比,且func.__name__返回的是包装函数名view,不是类视图名称。
  • 写法二错误:每次调用BookList.as_view()都会生成新的函数实例,两次调用的函数内存地址不同,无法直接相等。

内容的提问来源于stack exchange,提问作者Lucian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 21:03:22