2016-05-29 3 views
2

У меня возникла проблема с аутентификацией с помощью API Django Rest Framework в тестах Unit Unit. Система работает должным образом при доступе к ней через браузер. Я же получить статус 401 HTTP при отправке запроса поставленного на следующий класс в следующей конечной точке:Django APIClient login не работает

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

Испытание ниже следующим образом:

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 (...) возвращает истину, но учетные данные не отображаются для прикрепления к коллектору. Мои эксперименты в классах разрешений IsAuthenticated имели request.user = AnonymousUser. В классе BasicAuthentication auth = None.

Я что-то упускаю из-за использования BasicAuth в settings.py? Или даже в самом тесте?

Спасибо.

+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) 
Смежные вопросы