2013-12-16 7 views
5

したがって、ActoretsとRoleというモデルと、ViewsetsとHyperlinkedModelSerializerを使用するデフォルトのREST APIがあります。Django RESTフレームワーク:ユニットテストでHyperlinkedModelSerializerのURLフィールドを正しく使用する方法

私の目標:関連するアクタとロールを作成する単体テスト。

私のテストコードは、現在、次のとおりです。

def test_post_create_role_for_actor(self): 

    # default actor 
    actor = ActorFactory() 

    # inherits HyperlinkedModelSerializer 
    actor_serialized = ActorSerializer(actor) 

    postdata = { 
     'role': 'mydummyrole', 
     'actor': actor_serialized.data['url'] 
    } 

    ret = self.client.post(self.url, json.dumps(postdata), content_type='application/json') 

    self.assertEqual(ret.status_code, 201) 
    self.assertTrue(Role.objects.filter(role='mydummyrole', actor_id=actor.id).exists()) 

は今、これは生成されたURLのフィールドを取得するために、特にシリアライズ、私にとって非常に醜いです。

DeprecationWarning:シリアライザの文脈における要求が廃止されました を含めずにHyperlinkedIdentityFieldを使用して実際に、私は非推奨警告が表示されます。シリアライザをインスタンス化するときに context={'request': request}を追加します。

しかし、シリアライザによって生成された "url"フィールドは、どのリクエストとも無関係のようです。このフィールドを取得する適切な方法は何ですか?私はコンセプトが欠けていると感じています。または2つ。

TIA!ユニットテストのpreperationで

+3

URLを絶対に変換できるようにリクエストを渡す必要があります。参照してくださいhttp://django-rest-framework.org/api-guide/reverse –

答えて

5

、私が最初に俳優を挿入します:俳優のIDを使用してURLを取得するために、Djangoのreverseメソッドを使用すると

actor = ActorFactory() 
actor.save() 

、または任意のフィールドURLで識別子として使用します:

url = reverse('my_api.actor_resource', args={'id': actor.id}) 

どのようにあなたのリソースを設定したかによって異なりますが、可能でなければなりません。

+2

アイデアは、シリアル化されたURLは、それを生成した要求に依存すべきではないということです。したがって、残りのフレームワークは、URLを相対的ではなく絶対的なものにする要求を使用します。 –

関連する問題