为什么我不能在 Django rest-framework unittest 中传递位置参数
Why I cannot pass positional argument in 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'
你传递的是 kwargs 而不是 args。
替换为:
request = self.factory.get(reverse('users:user-details', args=('d6cb0d1850241a04caaae516f27762d0c0cbc716',)))
我已经实现了如下所示的测试方法:
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'
你传递的是 kwargs 而不是 args。
替换为:
request = self.factory.get(reverse('users:user-details', args=('d6cb0d1850241a04caaae516f27762d0c0cbc716',)))