Как я могу протестировать get_context_data () ListView в Django? - PullRequest
1 голос
/ 03 мая 2020

Я пытался написать unittest для ListView в Django 3.0.5. Мне нужно проверить данные, включенные в контекст. Приложение работает для этого представления, поэтому ошибки в реализации маловероятны. Но что я упустил при настройке теста?

Вот части моего источника:

urls.py:

app_name = 'gene'
urlpatterns = [
    path('persons/', views.PersonList.as_view(), name='person-list'),
    ...
]

views.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

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

Есть идеи?

1 Ответ

0 голосов
/ 03 мая 2020

Django имеет Client [Django -doc] , что позволяет вам проверить context. Обратите внимание, что обычно контекст не экспортируется в ответе HTTP, но он исправлен здесь, чтобы разрешить это для тестирования:

import unittest
from django.test import <b>Client</b>

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', <b>response.context</b>)

Таким образом, response имеет .context атрибут [Django -doc] .

Я советую использовать Client, поскольку представления на основе классов довольно сложны, поток может быть "расшифрован" , но требует некоторого навыка, используя простые .dispatch(), et c. вы получаете только HttpResponse без .context, поэтому, вероятно, лучше использовать инструменты Django, предлагаемые для этой задачи.

...