使用强制身份验证 Django Rest Framework 的单元测试
Unit Test Using Forcing Authentication Django Rest Framework
我正在使用 django rest 框架构建 RESTful API 服务,我已经到了必须为我的 RESTful [=34= 创建一个自动化测试的地步] 服务。
sessionList api需要令牌认证,如果用户没有令牌,他将无法访问会话集合。
当我使用 POSTMAN 和真实浏览器对其进行测试时,api 工作正常。
会话列表:
class SessionList(generics.ListCreateAPIView):
authentication_classes = [TokenAuthentication, ]
permission_classes = [IsAuthenticated, ]
throttle_scope = 'session'
throttle_classes = (ScopedRateThrottle,)
name = 'session-list'
filter_class = SessionFilter
serializer_class = SessionSerializer
ordering_fields = (
'distance_in_miles',
'speed'
)
def get_queryset(self):
return Session.objects.filter(owner=self.request.user)
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
然后我使用 DRF 测试创建了一个自动化测试
RunningSessionTest:
class RunningSessionTest(APITestCase):
def test_get_sessions(self):
factory = APIRequestFactory()
view = views.SessionList.as_view()
user = User.objects.create_user(
'user01', 'user01@example.com', 'user01P4ssw0rD')
request = factory.get('http://localhost:8000/sessions/')
force_authenticate(request, user=user)
response = view(request)
assert Response.status_code == status.HTTP_200_OK
def test_get_sessions_not_authenticated_user(self):
factory = APIRequestFactory()
view = views.SessionList.as_view()
user = User.objects.create_user(
'user01', 'user01@example.com', 'user01P4ssw0rD')
request = factory.get('http://localhost:8000/sessions/')
response = view(request)
assert Response.status_code == status.HTTP_401_UNAUTHORIZED
问题:在这两种情况下,无论用户是否拥有令牌,响应值都是 HTTP_200_OK
我尝试通过尝试不同的方法来实施测试来解决问题。我使用了 APIRequestFactory,我也使用了 APIClient,但我得到了相同的结果。老实说,在多次阅读文档后,我无法理解 APIClient 和 APIRequestFactory.
之间的区别
测试结果:
Traceback (most recent call last):
File "C:\python_work\DjnagoREST\restful01\RunKeeper\tests.py", line 67, in test_get_sessions_not_authenticated_user
assert Response.status_code == status.HTTP_401_UNAUTHORIZED
AssertionError
我将感谢你的帮助。
我想您需要将 Response.status_code
更改为 response.status_code
。
事实证明 Response.status_code(从 rest_framework.response.Response 开始)
等于 200 :D
我正在使用 django rest 框架构建 RESTful API 服务,我已经到了必须为我的 RESTful [=34= 创建一个自动化测试的地步] 服务。
sessionList api需要令牌认证,如果用户没有令牌,他将无法访问会话集合。
当我使用 POSTMAN 和真实浏览器对其进行测试时,api 工作正常。
会话列表:
class SessionList(generics.ListCreateAPIView):
authentication_classes = [TokenAuthentication, ]
permission_classes = [IsAuthenticated, ]
throttle_scope = 'session'
throttle_classes = (ScopedRateThrottle,)
name = 'session-list'
filter_class = SessionFilter
serializer_class = SessionSerializer
ordering_fields = (
'distance_in_miles',
'speed'
)
def get_queryset(self):
return Session.objects.filter(owner=self.request.user)
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
然后我使用 DRF 测试创建了一个自动化测试
RunningSessionTest:
class RunningSessionTest(APITestCase):
def test_get_sessions(self):
factory = APIRequestFactory()
view = views.SessionList.as_view()
user = User.objects.create_user(
'user01', 'user01@example.com', 'user01P4ssw0rD')
request = factory.get('http://localhost:8000/sessions/')
force_authenticate(request, user=user)
response = view(request)
assert Response.status_code == status.HTTP_200_OK
def test_get_sessions_not_authenticated_user(self):
factory = APIRequestFactory()
view = views.SessionList.as_view()
user = User.objects.create_user(
'user01', 'user01@example.com', 'user01P4ssw0rD')
request = factory.get('http://localhost:8000/sessions/')
response = view(request)
assert Response.status_code == status.HTTP_401_UNAUTHORIZED
问题:在这两种情况下,无论用户是否拥有令牌,响应值都是 HTTP_200_OK
我尝试通过尝试不同的方法来实施测试来解决问题。我使用了 APIRequestFactory,我也使用了 APIClient,但我得到了相同的结果。老实说,在多次阅读文档后,我无法理解 APIClient 和 APIRequestFactory.
之间的区别测试结果:
Traceback (most recent call last):
File "C:\python_work\DjnagoREST\restful01\RunKeeper\tests.py", line 67, in test_get_sessions_not_authenticated_user
assert Response.status_code == status.HTTP_401_UNAUTHORIZED
AssertionError
我将感谢你的帮助。
我想您需要将 Response.status_code
更改为 response.status_code
。
事实证明 Response.status_code(从 rest_framework.response.Response 开始) 等于 200 :D