python - 如何在 Django 中对 ListView 的 get_context_data() 进行单元测试?
问题描述
我试图在 Django 3.0.5 中为 ListView 编写单元测试。我需要检查上下文中包含的数据。应用程序正在为此视图运行,因此不太可能在实现中出错。但是在设置测试时我错过了什么?
这是我的部分来源:
网址.py:
app_name = 'gene'
urlpatterns = [
path('persons/', views.PersonList.as_view(), name='person-list'),
...
]
视图.py
from django.views.generic.list import ListView
from gene.models import Person
class PersonList(ListView):
model = Person
def get_context_data(self, **kwargs):
context = super(PersonList, self).get_context_data(**kwargs) # this is line 11
...
return context
测试.py:
from django.test import TestCase, RequestFactory
from django.urls import reverse
from gene.models import Person
from gene.views import PersonList
class PersonListTest(TestCase):
def setUp(self):
person1 = Person.objects.create(name="Person 1")
person2 = Person.objects.create(name="Person 2")
def test_context(self):
request = RequestFactory().get(reverse('gene:person-list'))
view = PersonList()
view.setup(request)
context = view.get_context_data() # this is line 20, Error here
self.assertIn('environment', context)
我按照官方文档中的指南进行操作。
但是当我运行这个测试时,我在控制台上得到了以下信息:
Error
Traceback (most recent call last):
File "/home/macbarfuss/PycharmProjects/Genealogy/gene/tests.py", line 20, in test_context
context = view.get_context_data()
File "/home/macbarfuss/PycharmProjects/Genealogy/gene/views.py", line 11, in get_context_data
context = super(PersonList, self).get_context_data(**kwargs)
File "/home/macbarfuss/PycharmProjects/Genealogy/venv/lib/python3.8/site-packages/django/views/generic/list.py", line 115, in get_context_data
queryset = object_list if object_list is not None else self.object_list
AttributeError: 'PersonList' object has no attribute 'object_list'
有任何想法吗?
解决方案
Django 有一个Client
[Django-doc]允许您检查context
. 请注意,通常情况下不会在 HTTP 响应中导出上下文,但在此处对其进行了修补以允许对其进行测试:
import unittest
from django.test import Client
class SimpleTest(unittest.TestCase):
def setUp(self):
self.client = Client()
person1 = Person.objects.create(name="Person 1")
person2 = Person.objects.create(name="Person 2")
def test_details(self):
response = self.client.get(reverse('gene:person-list'))
self.assertIn('environment', response.context)
所以response
有一个.context
属性 [Django-doc]。
我建议使用,Client
因为基于类的视图非常复杂,可以“解密”流程,但它需要一些技巧,通过使用简单.dispatch()
的等,你只能检索HttpResponse
没有 a 的 a .context
,所以最好使用Django为此任务提供的工具。
推荐阅读
- php - 通过 HTTP API 将大文件上传到 Dropbox
- python - 使用python减少for循环中的行数
- java - 需要从 spark java 中的一条记录生成两条记录
- xamarin - Xamarin,我如何立即从选择器和条目中清除数据。使用 montemagno Xamarin.plugins.setting
- flutter - 如何修复'RangeError(索引):无效值:有效值范围为空:0'在颤动
- django - 如何在模型类中使用覆盖 save() 分配对象权限?
- python - 我正在尝试添加一个 if 语句来检查输入是否是 python3 的字符串,无论如何在传递参数时都会返回错误
- jquery - jquery可排序将重复项移动到底部
- django - Django 数据库和迁移错误,ValueError: Related model 'Users.user' cannot be resolve
- c# - 如何在不丢失 POST 方法的情况下正确排除 Odata 中的密码属性