2016-05-29 67 views
2

我在單元單元測試中遇到了使用我的Django Rest Framework API進行身份驗證的問題。系統通過瀏覽器訪問時按預期工作。Django APIClient登錄不起作用

class UserDetail(RetrieveModelMixin, DestroyModelMixin, UpdateModelMixin, GenericViewSet): 
    authentication_classes = (BasicAuthentication, TokenAuthentication) 
    permission_classes = IsAuthenticated, 
    queryset = CustomUser.objects.all() 
    serializer_class = UserSerializer 

試驗下面如下:在下面的端點發送PUT請求發送到下面的類時,我然而收到一個401的HTTP狀態

class AccountTests(APITestCase): 

    def setUp(self): 
     self.user = CustomUser.objects.create_user(email="[email protected]", password="password1", is_staff=True) 
     self.user.save() 
     self.user = CustomUser.objects.get(email="[email protected]") 
     self.client = APIClient() 

    def test_add_name(self): 
     self.client.login(email="[email protected]", password='password1') 
     url = reverse('customuser-detail', args=(self.user.id,)) 
     data = {'first_name': 'test', 'last_name': 'user'} 

     self.client.login(email="[email protected]", password='password1') 
     response = self.client.put(url, data, format='json') 

     self.assertEqual(response.status_code, status.HTTP_200_OK) 

當打印response.data,我收到:

{u'detail': u'Authentication credentials were not provided.'} 

client.login(...)方法返回true,但憑據不會附加到標頭。我在IsAuthenticated權限類中的實驗有一個request.user = AnonymousUser。在BasicAuthentication類中,auth = None。

我錯過了關於在settings.py中使用BasicAuth的東西嗎?甚至在測試本身?

謝謝。

+0

你解決問題? – Ajax

回答

1

首先,{u'detail': u'Authentication credentials were not provided.'}發生在您「提供」的憑據與模型不匹配時。 (我認爲是錯誤信息)

所以,你應該設置用戶密碼爲set_password()方法,因爲加密。

self.user = CustomUser.objects.create_user(email="[email protected]", is_staff=True) 
self.user.set_password("password1") 
self.user.save() 

或者,您可以使用force_login()進行測試。

self.client.force_login(
    user=User.objects.first(), 
    backend='django.contrib.auth.backends.ModelBackend' # one of your AUTHENTICATION_BACKENDS 
) 
0

您可能需要使用force_authenticate()方法登錄,

def test_add_name(self): 
    self.client.force_authenticate(self.user)   
    ........ 

您可以考慮重新編寫測試用例,也許有點像這樣,

class AccountTests(APITestCase): 

    def setUp(self): 
     self.user = CustomUser.objects.create_user(email="[email protected]", password="password1", is_staff=True) 
     self.client = APIClient() 

    def test_add_name(self): 
     self.client.force_authenticate(self.user) 

     url = reverse('customuser-detail', args=(self.user.id,)) 
     data = {'first_name': 'test', 'last_name': 'user'} 
     response = self.client.put(url, data, format='json') 

     self.assertEqual(response.status_code, status.HTTP_200_OK)