【发布时间】:2017-03-06 13:51:28
【问题描述】:
我不知道如何测试基于 Django 类的视图是否从 URL 模式接收到预期的 kwargs。
如果我有我的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'
),
]
还有我的views.py:
from django.views.generic import DetailView
from myapp.models import Person
class PersonDetailView(DetailView):
model = Person
我可以测试对 URL 的请求是否调用了正确的视图,如下所示:
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__)
但我还想测试对/people/3/ 的请求是否会导致{'pk': '3'} 被传递给PersonDetailView,我无法确定在基于类的视图中何处接收kwargs为了测试它(我猜是通过修补接收方法)。
【问题讨论】:
-
当视图运行时,它会调用
dispatch(request, *args, **kwargs)你可以修补dispatch方法并检查kwargs['pk']。您可以看到as_view()方法如何返回可调用视图in the source code。 -
需要测试吗? :p Django 对正则表达式的 url 解析进行了测试。您可以通过使用 django 的测试客户端通过 url 发送请求来间接验证这一点,作为另一个测试的一部分。是否需要显式测试?
-
嗯,也许不是 dm03514... 似乎有很多方法可以测试或不测试 Django URL 和视图...
-
@Alasdair:谢谢。有没有办法在不使用 Django 的内置测试客户端的情况下做到这一点?还是在这种情况下有必要这样做?
-
测试客户端似乎是测试这个的最好方法,不清楚你为什么不想使用它。
标签: django unit-testing django-class-based-views