2016-11-16 10 views
2

私のファイルがREST APIをアップロードしているかどうかをユニットテストしようとしています。オンラインで枕を使って画像を生成するコードが見つかりましたが、シリアル化できません。Django Rest Framework - ユニットテスト画像ファイルのアップロード

これは、画像を生成するための私のコードです:

image = Image.new('RGBA', size=(50, 50), color=(155, 0, 0)) 
file = BytesIO(image.tobytes()) 
file.name = 'test.png' 
file.seek(0) 

そこで私は、この画像フィーユをアップロードしよう:

return self.client.post("/api/images/", data=json.dumps({ 
    "image": file, 
    "item": 1 
}), content_type="application/json", format='multipart') 

そして、私は次のエラーを取得:

<ContentFile: Raw content> is not JSON serializable 

をどのようにして枕画像をシリアライズ可能に変換できますか?

+0

あなたは 'json.dumps'コールを省略しようとしましたか?私のdjangoプロジェクトでは、テストクライアントを使用してデータを辞書としてポストするだけです。 – Brobin

答えて

2

にユニットテスト画像のアップロードのあなたの一般的な問題に多くのソリューションがありますが、それは問題を複雑にするように私は、このケースではJSONとしてあなたのデータを提出することをお勧めしません。提出するパラメータとファイルを指定してPOSTリクエストを作成してください。 Django REST FrameworkはJSONとしてシリアライズしなくてもうまく処理できます。私はこのように見えたしばらくAPIエンドポイントAにファイルをアップロードするためのテスト書い

:この場合

def test_post_photo(self): 
    """ 
    Test trying to add a photo 
    """ 
    # Create an album 
    album = AlbumFactory(owner=self.user) 

    # Log user in 
    self.client.login(username=self.user.username, password='password') 

    # Create image 
    image = Image.new('RGB', (100, 100)) 
    tmp_file = tempfile.NamedTemporaryFile(suffix='.jpg') 
    image.save(tmp_file) 

    # Send data 
    with open(tmp_file.name, 'rb') as data: 
     response = self.client.post(reverse('photo-list'), {'album': 'http://testserver/api/albums/' + album.pk, 'image': data}, format='multipart') 
     self.assertEqual(response.status_code, status.HTTP_201_CREATED) 

を、私は枕を使用して生成された画像を格納するtempfileモジュールを使用します。この例で使用されているwithの構文では、比較的簡単に要求本体にファイルの内容を渡すことができます。これに基づき

、このようなものは、あなたのユースケースのために働く必要があります。

image = Image.new('RGBA', size=(50, 50), color=(155, 0, 0)) 
file = tempfile.NamedTemporaryFile(suffix='.png') 
image.save(file) 

with open(file.name, 'rb') as data: 
    return self.client.post("/api/images/", {"image": data, "item": 1}, format='multipart') 

ところで、あなたのユースケースに応じて、ベース64エンコードされた文字列などの画像データを受け入れる方が便利かもしれません。

0

ファイルをJSONシリアライズ可能ではないバイトに変換しました。

あなたのAPIが受け取るものがわからなければ、file"image": file.decode('utf-8')としてエンコードする必要があります。

のREST API

関連する問題