4

Я пытаюсь написать некоторые функциональные тесты для REST API, написанные с использованием Django REST Framework. Однако это не очень специфично для этой структуры, поскольку это в основном общий материал Django.Написание функциональных тестов для Django RESTful API

Это то, что я хочу сделать

  1. Создайте пользователя в setUp метод тестового класса
  2. запроса пользователей маркер с API с помощью тестового клиента

тесты .py

from django.test import LiveServerTestCase 

from django.contrib.auth.models import User 
from django.test.client import Client 
from rest_framework.authtoken.models import Token 

class TokenAuthentication(LiveServerTestCase): 
    def setUp(self): 
     user = User.objects.create(username='foo', password='password', email="[email protected]") 
     user.save() 
     self.c = Client() 

    def test_get_auth_token(self): 
     user = User.objects.get(username="foo") 
     print user # this outputs foo 
     print Token.objects.get(user_id = user.pk) # this outputs a normal looking token 
     response = self.c.post("/api-token-auth/", {'username': 'foo', 'password': 'password'}) 
     print response.status_code # this outputs 400 
     self.assertEqual(response.status_code, 200, "User couldn't log in") 

Когда я запускаю тест, он возвращает статус 400, а не 200, поэтому пользователь не прошел аутентификацию. Если я введу учетные данные пользователя, который уже находится в базе данных, он проходит. Поэтому я полагаю, что записи, созданные в тестовом классе, доступны только в своих собственных методах, что, вероятно, связано с тем, что оно предназначено для модульного тестирования. Но я использую данные из базы данных для выполнения теста, который он сработает, если данные изменятся.

Как должен выполняться функциональный тест, например, когда данные должны быть созданы перед запуском теста, в Django?

ответ

9

Вы неправильно создали пользователь. User.objects.create устанавливает пароль в текстовом виде, а не через механизм хэширования. Вместо этого вы должны использовать User.objects.create_user, который правильно настроит пароль, чтобы вы могли аутентифицироваться с именем пользователя и паролем.

+0

Ну, это смущает, спасибо! –

Смежные вопросы