0

我想測試一個User模型並在Python 3.4環境中查看,但我在解決問題時遇到困難。Django REST測試:屬性丟失

在我的應用程序中,只有職員用戶應該能夠添加/刪除/修改用戶配置文件。因此,在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框架文檔,尤其是APIClient,PermissionsBasicAuthentication指南,但我一直無法找到關於此問題的其他信息。我已經嘗試評論強制認證,並沒有解決任何問題。

讚賞任何數量的幫助或洞察力!我正在學習Django REST。

+1

IIRC'force_authenticate()'應該得到一個用戶對象,而不是用戶名的字符串。因此'self.client.force_authenticate(user = self.admin)'在你的情況下。 – Jkdc

+0

@Jkdc非常感謝。這樣一個簡單的修復! – Jonathan

+0

很高興幫助!我將提交它作爲答案。 – Jkdc

回答

1

force_authenticate()需要用戶對象爲user爭論,而不是用戶名的字符串。

所以你的情況,你會使用

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