如何针对类视图使用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__)
尝试过的错误写法及对应报错
- 写法一:
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>
- 写法二:
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
相关产品推荐
相关产品推荐

