Django REST测试:属性缺失

时间:2015-08-20 18:16:02

标签: django python-3.x django-models django-views django-rest-framework

我正在尝试在User环境中测试Python 3.4模型和视图,但我在解决问题时遇到了困难。

在我的应用中,只有员工用户才能添加/删除/修改用户个人资料。因此,在setUp上,我创建了一个管理员用户,其中设置了字段 is_staff 。然后,在测试用例中,我强制认证为此管理员用户,这应该允许我创建新用户。此代码如下所示:

class UserTests(APITestCase):

    def setUp(self):
        self.admin = User(username='admin', password='pass', is_staff=True)
        self.admin.save()

    def test_create_user(self):
        """
        Ensure we can create a new user object without any optional fields.
        """
        url = reverse('user-list')
        data = {'username': 'adam', 'is_staff': False}
        self.client.force_authenticate(user='admin')
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(response.data, data)

运行此测试用例会产生以下错误跟踪:

Error
Traceback (most recent call last):
  File "/Users/Jonathan/GitHub/h2oiq_api/h2oiq_api/test.py", line 19, in test_create_user
    response = self.client.post(url, data, format='json')
    .
    .
    .
  File "/Users/Jonathan/.virtualenvs/h2oiq-api/lib/python3.4/site-packages/rest_framework/test.py", line 90, in post
    return self.generic('POST', path, data, content_type, **extra)
  File "/Users/Jonathan/.virtualenvs/h2oiq-api/lib/python3.4/site-packages/rest_framework/views.py", line 359, in initial
    self.check_permissions(request)
    .
    .
    .
  File "/Users/Jonathan/.virtualenvs/h2oiq-api/lib/python3.4/site-packages/rest_framework/views.py", line 304, in check_permissions
    if not permission.has_permission(request, self):
  File "/Users/Jonathan/.virtualenvs/h2oiq-api/lib/python3.4/site-packages/rest_framework/permissions.py", line 55, in has_permission
    return request.user and request.user.is_staff
AttributeError: 'str' object has no attribute 'is_staff'

有人可以详细说明为什么缺少这个属性吗?我已经彻底阅读了Django REST框架文档,特别是APIClientPermissionsBasicAuthentication指南,但我无法找到有关此问题的任何其他信息。我试过评论强制认证,但没有解决任何问题。

赞赏任何数量的帮助或见解!我正在学习Django REST。

1 个答案:

答案 0 :(得分:1)

force_authenticate()获取user争论的用户对象,而不是用户名的字符串。

所以在你的情况下你会使用

self.client.force_authenticate(user=self.admin)