2015-02-18 6 views
2

Я работаю над своим первым проектом, который использует Django REST Framework, и у меня возникают проблемы с тестированием API. Я получаю 403 Запрещенные ошибки вместо ожидаемых 200 или 201. Однако API работает так, как ожидалось.тестирование Django REST Framework

Я прошел через DRF Testing docs, и все это кажется простым, но я считаю, что мой клиент не входит в систему. Обычно в моих проектах Django я использую смесь заводского мальчика и веб-сайта django, который у меня был много счастливого успеха. Я не нахожу того же счастья, тестируя API DRF через пару дней возиться.

Я не уверен, что это проблема, связанная с чем-то, что я делаю неправильно с DRF APITestCase/APIClient или проблемой с тестом django в целом.

Я просто вставляю следующий код и не отправляю сериализаторы/виды, потому что API работает в браузере, похоже, что у меня просто проблемы с аутентификацией APIClient в APITestCase.

# settings.py 
REST_FRAMEWORK = { 
    # Use Django's standard `django.contrib.auth` permissions, 
    # or allow read-only access for unauthenticated users. 
    'DEFAULT_PERMISSION_CLASSES': [ 
     'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' 
    ] 
} 


# tests.py 
from django.test import TestCase 

from rest_framework.test import APITestCase, APIClient 

from accounts.models import User 
from .factories import StaffUserFactory 


class MainSetUp(TestCase): 
    def setUp(self): 
     self.user = StaffUserFactory 
     self.api_root = '/api/v0/' 
     self.client = APIClient() 


class APITests(MainSetUp, APITestCase): 

    def test_create_feedback(self): 
     """ 
     Ensure we can create a new account object. 
     """ 
     self.client.login(username='staffuser', password='staffpassword') 

     url = '%sfeedback/' % self.api_root 
     data = { 
      'feedback': 'this is test feedback' 
     } 
     response = self.client.post(url, data, user=self.user) 

     self.assertEqual(response.status_code, 201) 
     self.assertEqual(response.data, data) 


# factories.py 
from factory.django import DjangoModelFactory 

from django.contrib.auth import get_user_model 

User = get_user_model() 


class UserFactory(DjangoModelFactory): 
    class Meta: 
     model = User 


class StaffUserFactory(UserFactory): 
    username = 'staffuser' 
    password = 'staffpassword' 
    email = '[email protected]' 
    first_name = 'Staff' 
    last_name = 'User' 
    is_staff = True 

ответ

1

Я никогда не использовал DjangoModelFactory раньше, но это, кажется, что вы должны вызвать создать после установки вашего пользователя в StaffUserFactory. http://factoryboy.readthedocs.org/en/latest/_modules/factory/django.html#DjangoModelFactory

class MainSetUp(TestCase): 
    def setUp(self): 
     self.user = StaffUserFactory 
     self.user.create() 
     self.api_root = '/api/v0/' 
     self.client = APIClient() 
1

Держу пари пароль вашего пользователя не быть установлен правильно. Вы должны использовать set_password. В начале, пытаясь изменить свою нАлАдкУ к этому:

def setUp(self): 
    self.user = StaffUserFactory 
    self.user.set_password('staffpassword') 
    self.user.save() # You could probably omit this, but set_password does't call it 
    self.api_root = '/api/v0/' 
    self.client = APIClient() 

Если это работает, вы, вероятно, хотите переопределить _generate() в вашей фабрике, чтобы добавить этот шаг.

Другое дело, что SessionAuthentication находится в вашей настройке DEFAULT_AUTHENTICATION_CLASSES.

0

Я думаю, что вы должны создать экземпляр Factory, чтобы получить реальный объект, например:

self.user = StaffUserFactory() 

Надеется, что помощь.

Кроме того, вам не нужно создавать отдельный класс для персонала, достаточно установить is_staff=True. Пример:

self.user = UseFactory(is_staff=True) 
Смежные вопросы