代码之家  ›  专栏  ›  技术社区  ›  Evan Zamir

试图找出Django Rest Framework API测试后出现400错误的原因

  •  4
  • Evan Zamir  · 技术社区  · 8 年前

    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'...
    

    这是序列化程序:

    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 回复  |  直到 8 年前
        1
  •  3
  •   zaidfazil    8 年前

    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()