Chidananda Nayak
Chidananda Nayak

Reputation: 1201

Django Testing: URL mapping to the Class Based View

I'm new to Django testing so trying basic testing codes. But it is showing one error in second test class

Tests.py

from django.test import TestCase,Client
from .views import PostList
from django.urls import resolve


class SmokeTest2(TestCase):
    def test_math(self):
        self.assertEqual(1+1,2)

class HomePageTest(TestCase):
    def test_root_url_resolves_to_home_page_view(self):
        found = resolve('/')
        print({'found':found})
        self.assertEqual(found.func(), PostList)

views.py

class PostList(ListView):
    model = Post
    template_name = 'home.html'

urls.py

urlpatterns = [
    path('',views.PostList.as_view(),name ='list'),
]

When i am printing found its showing the o/p

{'found': ResolverMatch(func=blog.views.PostList, args=(), kwargs={}, url_name=list, app_names=[], namespaces=[])}

But still I am getting this error

(blog_env) PS D:\django\blog_env\mysite> python manage.py test
D:\django\blog_env\mysite
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
{'found': ResolverMatch(func=blog.views.PostList, args=(), kwargs={}, url_name=list, app_names=[], namespaces=[])}
E.
======================================================================
ERROR: test_root_url_resolves_to_home_page_view (blog.tests.HomePageTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "D:\django\blog_env\mysite\blog\tests.py", line 19, in test_root_url_resolves_to_home_page_view
    self.assertEqual(found.func(), PostList)
TypeError: view() missing 1 required positional argument: 'request'

----------------------------------------------------------------------
Ran 2 tests in 0.069s

FAILED (errors=1)
Destroying test database for alias 'default'... 

Upvotes: 3

Views: 2162

Answers (4)

Hetvee Sanghani
Hetvee Sanghani

Reputation: 43

from django.urls import resolve, reverse
class HomePageViewViewTest(TestCase):
def test_resolve_to_home_page_view(self):
    resolver = resolve('/')
    self.assertEqual(resolver.func.view_class, HomePageView)

You can try this, it worked for me!

Upvotes: 3

user13964893
user13964893

Reputation: 1

from django.urls import resolve, reverse


class HomePageTest(TestCase):
    def test_root_url_resolves_to_home_page_view(self):
        response = self.client.get(resolve('/'))
        response = self.client.get(reverse('your_app_name:list'))
        self.assertEqual(response.status_code, 200)

Upvotes: -1

Kingsley Ijomah
Kingsley Ijomah

Reputation: 3403

I was stung by this issue just now, ended up finding the solution in the documentation

class-based views need to be compared by name, as the functions generated by as_view() won't be equal due to different object ids, so the assertion should look like the below:

from django.test import TestCase
from django.urls import resolve
from .views import HomePageView

class HomePageViewViewTest(TestCase):
    def test_resolve_to_home_page_view(self):
        resolver = resolve('/')
        self.assertEqual(resolver.func.__name__, HomePageView.as_view().__name__)

Upvotes: 5

AR7
AR7

Reputation: 376

Since you are testing a Class based View, from the Traceback it can be seen that it's missing the request object. You can use the RequestFactory provided by the django.test package. Better read the following RequestFactory Documentation to get a good view of it. It will solve your problem.

Upvotes: 0

Related Questions