2014-11-04 255 views
0

我在那里,所以我试图用DRF单元测试,我有与.postDjango的REST框架单元测试

一些问题,我认为这是与我使用的,但我不能外键没有找到任何好的例子。

串行:

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = get_user_model() 
     fields = ('password', 'id', 'username', 'email') 
     write_only_fields = ('password',) 

    def restore_object(self, attrs, instance=None): 
     # call set_password on user object. Without this 
     # the password will be stored in plain text. 
     user = super(UserSerializer, self).restore_object(attrs, instance) 
     user.set_password(attrs['password']) 
     return user 

class MultimediaSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Multimedia 


class SpaceSerializer(serializers.ModelSerializer): 
    user = UserSerializer() 
    avatar = serializers.HyperlinkedRelatedField(view_name='multimedia-detail') 
    contents = serializers.HyperlinkedRelatedField(
     many=True, view_name='multimedia-detail' 
    ) 
    api_key = serializers.SerializerMethodField('get_api_token') 

    class Meta: 
     model = Space 

型号:

class UserProfile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL) 
    avatar = models.ForeignKey(
     'core.Multimedia', blank=True, null=True, 
     related_name='user_profiles_avatares' 
    ) 
    language = models.ForeignKey('core.Language', blank=True, null=True) 
    birth_date = models.DateTimeField(blank=True, null=True) 
    country = CountryField(blank=True, default='PT') 
    about_me = models.TextField(blank=True, default='') 
    facebook_token = models.TextField(blank=True, default='') 
    space_themed_motivation = models.TextField(blank=True, default='') 
    created_on = models.DateTimeField(auto_now_add=True) 
    updated_on = models.DateTimeField(auto_now=True) 
    last_login_on = models.DateTimeField(auto_now=True) 


class Space(UserProfile): 
    degree = models.CharField(max_length=200, blank=True) 
    galleries = models.ManyToManyField('core.Gallery', blank=True, null=True) 
    contents = models.ManyToManyField('core.Multimedia', blank=True, null=True) 

所以,我在此端点使用我的身体数据:

def test_register_space(self): 
    url = reverse('space-list') 
    data = { 
     "user": { 
     "username": "blaya2", 
     "email": "[email protected]", 
     "password": "blayablaya" 
     }, 
     "avatar": "http://localhost:8000/api/v1/multimedia/1/", 
     "contents": [ 
     "http://localhost:8000/api/v1/multimedia/1/", 
     "http://localhost:8000/api/v1/multimedia/2/" 
     ], 
     "language": "PT", 
     "birth_date": "2014-10-30T10:59:22Z", 
     "country": "PT", 
     "about_me": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum", 
     "facebook_token": "CAALDUez5gFsBAHGZCsi1BOeKwc", 
     "space_themed_motivation": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum", 
     "created_on": "2014-10-30T10:59:30.556Z", 
     "updated_on": "2014-10-30T11:30:00.717Z", 
     "last_login_on": "2014-10-30T11:30:00.717Z", 
     "degree": "Mestrado" 
    } 

    response = self.client.post(url, data, format='json') 
    print response.data 

,然后我用response = self.client.post(url, data, content_type='application/json') 我把它称之为也试过没有运气的json.dumps()。我总是得到400状态码。

当我这样做print response.data我得到:

{'language': [u"Invalid pk 'PT' - object does not exist."], 'user': [{u'non_field_errors': [u'Invalid data']}], 'contents': [u'Invalid hyperlink - object does not exist.'], 'avatar': [u'Invalid hyperlink - object does not exist.']} 

我明白我必须有链接指向,但我不知道语法得到这个工作。

有谁知道我可以如何得到这个工作?

+1

我知道你发布这篇文章已经很长时间了,但你有没有想出一个解决方案? – cjukjones 2016-02-24 02:06:59

回答

0

在测试中,您必须将您的JSON数据序列化为json.dumps

response = self.client.post(url, json.dumps(data), content_type='application/json') 

如果这仍然不起作用,您应该检查响应包含的内容。它应该给你一个更具体的错误信息,这将有助于你解决你的问题。

+0

我在那里,我曾试过这个,没有运气。我用模型/序列化器更新了我的帖子。我得到'{'语言':[u'无效pk'PT' - 对象不存在。“],'avatar':[u'无效超链接 - 对象不存在。'],'contents':[u '无效的超链接 - 对象不存在。']}'也许是因为我没有正确设置外键,但我不知道如何做到这一点 – psychok7 2014-11-05 09:18:43

+0

你有外键的例子? – psychok7 2014-11-05 20:16:08

1

400状态码意味着你的json中有一些不好的数据。也许你错过了必填字段等。你应该尝试打印出response.content。如果一切正常,它会显示你的对象。否则,它显示的错误消息应该比400更具信息性。

+0

它的definetly必填字段,但外键不似乎工作。我已经使用模型/序列化程序更新了我的代码 – psychok7 2014-11-05 09:19:26

+0

有一个问题似乎是,您正在为语言提供'PT',但它期待着一个超链接。这适用于'语言','用户','头像'。 – timop 2014-11-05 11:31:33

+0

什么是正确的语法我应该使用超链接时测试?? – psychok7 2014-11-05 11:40:06