首页 > 解决方案 > 为什么我不能在 Django rest-framework unittest 中传递位置参数

问题描述

我已经实现了一个测试方法,如下所示:

request = self.factory.get(reverse('users:user-details', kwargs={'user_id': 'd6cb0d1850241a04caaae516f27762d0c0cbc716'}))
response = UserDetailsAPIView.as_view()(request)

URL路径如下:

url(
        r'users/(?P<user_id>\w+)/details/?$',
        UserDetailsAPIView.as_view(),
        name='user-details'
)

它的API视图如下:

class UserDetailsAPIView(APIView):
    http_method_names = ['get']

    def get(self, request, user_id, *args, **kwargs):

为什么我收到以下错误:

Traceback (most recent call last):
  File "/home/.local/lib/python3.5/site-packages/mock/mock.py", line 1305, in patched
    return func(*args, **keywargs)
  File "/vagrant/apps/users/tests/test_views.py", line 95, in test_get_user_detail_by_user_id
    response = UserDetailsAPIView.as_view()(request)
  File "/home/.local/lib/python3.5/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/.local/lib/python3.5/site-packages/django/views/generic/base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/.local/lib/python3.5/site-packages/rest_framework/views.py", line 495, in dispatch
    response = self.handle_exception(exc)
  File "/home/.local/lib/python3.5/site-packages/rest_framework/views.py", line 455, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/.local/lib/python3.5/site-packages/rest_framework/views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)
TypeError: get() missing 1 required positional argument: 'user_id'

标签: pythondjangodjango-rest-frameworkpython-unittest

解决方案


您作为 kwargs 而不是 args 传递。

替换这个:

request = self.factory.get(reverse('users:user-details', args=('d6cb0d1850241a04caaae516f27762d0c0cbc716',)))

推荐阅读