如何在Django中通过unittest获取ListView的_context_data()?

2024-09-27 09:33:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在Django3.0.5中为ListView编写一个单元测试。我需要检查上下文中包含的数据。应用程序正在为此视图运行,因此实现中不太可能出现错误。但我在设置测试时错过了什么

以下是我的部分资料来源:

url.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'

有什么想法吗


Tags: frompyimportselfviewdatagetobject
1条回答
网友
1楼 · 发布于 2024-09-27 09:33:03

Django有一个^{} [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有一个^{} attribute [Django-doc]

我建议使用Client,因为基于类的视图非常复杂,流可以“去加密”,但它需要一些技巧,通过使用简单的.dispatch(),等等。您只检索一个HttpResponse,而不检索.context,因此使用Django为这项任务提供的工具可能更好

相关问题 更多 >

    热门问题