【问题标题】:Test API Key to return mock data with Django Rest Framework and TokenAuthentication使用 Django Rest Framework 和 TokenAuthentication 测试 API 密钥以返回模拟数据
【发布时间】:2026-02-23 02:10:01
【问题描述】:

我正在使用 Django Rest Framework 构建一个 REST-ful API。我之前处理过与 REST API 的集成工作,并获得了专门用于集成测试的测试 API 密钥,这些密钥允许您发送数据并返回模拟数据,但不会将数据放入系统中。我正在尝试在我的 API 中实现同样的功能,但我还没有找到方法。

【问题讨论】:

    标签: django rest django-rest-framework


    【解决方案1】:

    你可以使用一些装饰器来做到这一点:)

    from django.contrib.auth import authenticate
    def mock_funcname(func):
    
        def wrapper(request, *args, **kwargs):
            user = authenticate(token=request.REQUEST['token'])
            if user.id == 'TEST USER ID':
                return Response({'detail': "Some stuff mocked for this user :)"})
            return func(request, *args, **kwargs)
    
        return wrapper
    

    所以现在你可以把它和其他装饰器一样:

    @api_view(['POST'])
    @permission_classes((IsAuthenticated,))
    @mock_funcname
    def funcname(request, pid=None):
        return response......
    

    这是一个基本功能,你需要让它变得更复杂

    【讨论】:

      【解决方案2】:

      首先,您可以安装mommy 以在您的测试中创建模拟数据。 因此,在您的 tests.py 中,您可以为您的 API 创建一个测试,检查 status_code 和响应:

      def test(self):
         user = mommy.make(User) # Create a fake user
         token = Token.objects.get(user__username=user.username) # Generate a token
         self.client.credentials(HTTP_AUTHORIZATION='Token ' + token.key) # Token for your request
         response = self.client.post("url", your_data) # POST in your URL
         self.assertEqual(response.status_code, status.HTTP_201_CREATED) # Status Code of Creation
         self.assertEqual(User.objects.last().first_name, user.first_name) # Check the fields created
      

      然后运行运行python manage.py test 的测试或遵循DRF 中的文档

      【讨论】:

      • 妈妈会为实时集成测试而不是单元测试运行工作吗?
      • 我不这么认为!因为它创建了一个运行manage.py test 的假数据库。但是,如果您不想在系统中保存给定密钥的请求,最好使用multiple databases,这样您就可以将测试数据库与真实数据库分开。
      最近更新 更多