【问题标题】:Unit Test Using Forcing Authentication Django Rest Framework使用强制身份验证 Django Rest 框架的单元测试
【发布时间】:2019-07-28 18:12:33
【问题描述】:

我正在使用 django rest 框架构建 RESTful API 服务,我已经到了必须为我的 RESTful API 服务创建自动化测试的地步。

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\01\restful01\RunKeeper\tests.py", line 67, in test_get_sessions_not_authenticated_user
    assert Response.status_code == status.HTTP_401_UNAUTHORIZED
AssertionError

感谢您的帮助。

【问题讨论】:

    标签: django rest django-rest-framework drf-queryset


    【解决方案1】:

    我猜你需要将Response.status_code 更改为response.status_code

    结果是 Response.status_code(来自 rest_framework.response.Response) 等于 200 :D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-29
      • 2017-09-26
      • 2017-11-02
      • 2019-03-01
      • 2021-12-21
      • 1970-01-01
      • 2015-07-24
      • 2015-06-04
      相关资源
      最近更新 更多