2014-11-04 233 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