尝试在后期测试中找出400错误的原因Django-Rest-Framework API

时间:2017-07-04 17:23:14

标签: django django-rest-framework

以下是我正在测试的模型:

class Entity(TimestampModerated):
    name = models.CharField(max_length=255)
    slug = models.SlugField(unique=True)
    description = models.TextField(verbose_name='description of entity', blank=True)
    media = models.URLField(verbose_name='media representing entity (image, mp3, mpg, etc)',
                            blank=True, null=True)
    uuid = models.UUIDField(db_index=True,
                            default=uuid_lib.uuid4(),
                            editable=False,
                            )
    owner = models.ForeignKey('auth.User', related_name='entities', on_delete=models.CASCADE)
    tags = TaggableManager(blank=True)

    def get_absolute_url(self):
        return reverse('entities:detail', kwargs={'slug': self.slug})

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = "entities"

以下是ViewSet

class EntityViewSet(viewsets.ModelViewSet):
    """
    This viewsetomatically provides `list`, `create`, `retrieve`,
    `update` and `destroy` actions.

    Additionally we also provide an extra `highlight` action.
    """
    queryset = Entity.objects.all()
    serializer_class = EntitySerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                          IsOwnerOrReadOnly,)
    lookup_field = 'slug'

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

以下是我的网址:

router = DefaultRouter()
router.register(r'entities', views.EntityViewSet)
router.register(r'users', views.UserViewSet)

urlpatterns = [
    url(r'^', include(router.urls)),
]

这是我的测试:

class EntitiesAPITests(test.APITestCase):
    def setUp(self):
        test_user = models.User.objects.create(username='testuser', password='password')

    def test_login_post(self):
        client = APIClient()
        client.login(username='testuser', password='password')
        response = client.post('/api/entities/', data={
            'name': 'Sean Penn',
            'slug': 'sean-penn'
        })
        self.assertContains(response, 200)
        client.logout()

当我运行测试时,我得到以下错误,我无法弄清楚:

======================================================================
FAIL: test_login_post (entities.tests.test_api.EntitiesAPITests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/xxx/xxx/entities/tests/test_api.py", line 63, in test_login_post
    self.assertContains(response, 200)
  File "/Users/xxx/xxx/.virtualenv/lib/python3.6/site-packages/django/test/testcases.py", line 385, in assertContains
    response, text, status_code, msg_prefix, html)
  File "/Users/xxx/xxx/.virtualenv/lib/python3.6/site-packages/django/test/testcases.py", line 357, in _assert_contains
    " (expected %d)" % (response.status_code, status_code)
AssertionError: 400 != 200 : Couldn't retrieve content: Response code was 400 (expected 200)

----------------------------------------------------------------------
Ran 10 tests in 0.280s

FAILED (failures=1)
Destroying test database for alias 'default'...

这是Serializer:

from django.contrib.auth.models import User
from rest_framework import serializers
from taggit_serializer.serializers import TagListSerializerField

from entities.models import Entity


class EntitySerializer(serializers.ModelSerializer):
    owner = serializers.CharField(source='owner.username', read_only=True)
    tags = TagListSerializerField()

    class Meta:
        model = Entity
        fields = ('id', 'created', 'name', 'description', 'media', 'moderation_code', 'owner', 'updated', 'tags',
                  'slug', 'uuid')

1 个答案:

答案 0 :(得分:3)

尝试更改,

class EntitiesAPITests(test.APITestCase):
    def setUp(self):
        self.user = models.User.objects.create(username='testuser', password='password')

    def test_login_post(self):
        client = APIClient()
        client.force_authenticate(self.user)
        response = client.post('/api/entities/', data={
            'name': 'Sean Penn',
            'slug': 'sean-penn'
        })
        self.assertContains(response, 200)
        client.logout()