【问题标题】:Django Testing: URL mapping to the Class Based ViewDjango 测试:URL 映射到基于类的视图
【发布时间】:2018-07-19 05:32:00
【问题描述】:

我是 Django 测试的新手,因此尝试了基本的测试代码。但它在第二个测试类中显示一个错误

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'),
]

当我打印 found 时,它会显示 o/p

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

但我仍然收到此错误

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

【问题讨论】:

  • 试试,self.assertEqual(found.func(), PostList.as_view())
  • @JerinPeterGeorge 添加上述代码后显示相同的错误.. Traceback (most recent call last): File "D:\django\blog_env\mysite\blog\tests.py", line 26, in test_root_url_resolves_to_home_page_view self.assertEqual(found.func(), PostList.as_view()) TypeError: view() missing 1 required positional argument: 'request'

标签: django django-testing


【解决方案1】:
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)

你可以试试这个,它对我有用!

【讨论】:

    【解决方案2】:

    我刚才被这个问题刺痛了,最后在documentation找到了解决方案

    基于类的视图需要按名称进行比较,因为 as_view() 生成的函数由于对象 id 不同而不会相等,因此断言应如下所示:

    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__)
    

    【讨论】:

    • 这是在官方文档中,应该被认为是公认的解决方案
    【解决方案3】:
    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)
    

    【讨论】:

      【解决方案4】:

      由于您正在测试基于类的视图,因此从 Traceback 可以看出它缺少请求对象。您可以使用 django.test 包提供的 RequestFactory。最好阅读以下RequestFactory Documentation 以更好地了解它。它会解决你的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-28
        • 2014-02-16
        • 2020-06-30
        • 2012-01-25
        • 2014-01-22
        • 2019-01-24
        相关资源
        最近更新 更多