Phil Gyford
Phil Gyford

Reputation: 14584

How to test a Django class-based view receives correct arguments?

I can't work out how to test that a Django class-based view receives the expected kwargs from a URL pattern.

If I have my urls.py:

from django.conf.urls import url
from myapp import views

urlpatterns = [
    # ...
    url(
        regex=r"^people/(?P<pk>\d+)/$",
        view=views.PersonDetailView.as_view(),
        name='person_detail'
    ),
]

And my views.py:

from django.views.generic import DetailView
from myapp.models import Person

class PersonDetailView(DetailView):
    model = Person

I can test that a request to the URL calls the correct view like this:

from django.test import TestCase
from django.urls import resolve
from myapp import views
from myapp.factories import PersonFactory

class UrlsTestCase(TestCase):

    def test_person_detail_view(self):
        PersonFactory(pk=3)
        self.assertEqual(resolve('/people/3/').func.__name__,
                         views.PersonDetailView.__name__)

But I'd also like to test that a request to /people/3/ results in {'pk': '3'} being passed to PersonDetailView, and I can't work out where in a class-based view receives the kwargs in order to test it (by patching the receiving method, I guess).

Upvotes: 1

Views: 1982

Answers (1)

user6516856
user6516856

Reputation:

Here's how I checked the id or pk on my views (I'm using Django1.11):

from menus.models import Item
from menus.views import ItemListView
from django.test import RequestFactory
from django.contrib.auth.models import User


person = User.objects.get(username='ryan')
factory = RequestFactory()

request = factory.get('/items/')
request.user = person

response = ItemListView.as_view()(request)

#prints the id or pk of the requesting user
response._request.user.pk
response._request.user.id

Upvotes: 2

Related Questions