[英]How can I unittest get_context_data() of a ListView in Django?
我嘗試在 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()
等。您只能檢索沒有.context
的HttpResponse
,所以最好使用 Django 為這項任務提供的工具。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.