django测试不会填充request.auth

时间:2015-11-09 11:01:58

标签: django unit-testing django-rest-framework

我制作了一个名为/cars的端点。 一个人可以创建带前端的汽车,但是设备使用具有API密钥的SDK读取汽车。通过这种方式,2家租车公司可以使用API​​而不会让汽车混乱。每个应用都有自己的API密钥和自己管理内容的人。

这是使用django restframework 3.x和django-oauth-toolkit实现的。

我正在为人类检索汽车而写一个测试,而另一个用于设备。

这是失败的:

def test_get_list(self):
    # devices have a django user (AUTH_USER_MODEL ---onetoone--- Device)
    self.client.force_authenticate(user=self.user_device)
    self._get_list()
    self.client.force_authenticate(user=None)

force_authentication将request.auth设置为None。但是,对于邮递员或httpie,request.auth包含Application对象。

查询集是:

def get_queryset(self):
    if hasattr(self.request.user, 'device'):
        # get the cars created by the owner of the API Key
        return self.request.auth.application.user.cars.all()
    return self.request.user.cars.all() # get my cars
  1. 查询集中的这种方法是否有意义?
  2. 我是以错误的方式测试的吗?
  3. 为什么request.auth为空?是使用BasicAuthentication进行force_authentication吗?

2 个答案:

答案 0 :(得分:1)

  1. 我建议您使用check_object_permission进行此类检查。您可以阅读更多here

  2. DRF文档指出,如果您使用APIRequestFactory,则需要强制验证请求。来自documentation

    from rest_framework.test import force_authenticate
    
    factory = APIRequestFactory()
    user = User.objects.get(username='olivia')
    view = AccountDetail.as_view()
    
    # Make an authenticated request to the view...
    request = factory.get('/accounts/django-superstars/')
    force_authenticate(request, user=user)
    response = view(request)
    

    要使用APIClient进行身份验证,请尝试使用credentialsdocumentation的示例:

    from rest_framework.authtoken.models import Token
    from rest_framework.test import APIClient
    
    # Include an appropriate `Authorization:` header on all requests.
    token = Token.objects.get(user__username='lauren')
    client = APIClient()
    client.credentials(HTTP_AUTHORIZATION='Token ' + token.key)
    
  3. 同样是第二个问题。

答案 1 :(得分:1)

正如documentation force_authenticate绕过身份验证所指出的那样,您的工作就是模拟丢失的身份验证部分,包括填写request.auth。

否则,您需要配置数据集并在APIClient实例上调用登录或凭据。