44

REST API に django-rest-framework (最新) を使用しており、組み込みのテスト クライアントを使用して django にいくつかのテスト ケースを実装しています。

次のdjangoテストケースは、djangoバージョン<1.5で正常に機能していました

self.client.put('/core/accounts/%s/'% self.account.id,
        data = prepare_dict(self.account),
        HTTP_AUTHORIZATION=self.token)

django 1.5 にアップグレードし、 HTTP PUTに関連するテストを除いて、すべてのテストに合格 しています。リクエスト・イン・ザ・テスト・クライアント

content_type なしで PUT 要求で data パラメーターを使用していた場合は、データをテスト クライアントに渡す前にエンコードし、content_type 引数を設定する必要があります。

したがって、この変更を反映するようにテストを更新し、フォローしようとしましたが、まだ http 200 ではなく http 415 を取得しています

from django.test.client import MULTIPART_CONTENT, BOUNDARY, encode_multipart
self.client.put('/core/accounts/%s/'% self.account.id,
            data = encode_multipart(BOUNDARY, prepare_dict(self.account)),
                content_type=MULTIPART_CONTENT,
        HTTP_AUTHORIZATION=self.token)

私が見逃しているものはありますか?PS: すべての機能は、django-rest-framework 組み込み Web UI から正常に動作しています。

4

3 に答える 3

51

あなたは完全に正しい方向に進んでいます-その場合の破壊テストは確かにDjangoのPUTテストクライアントの振る舞いの変化によるものです。

あなたの修正は私にも正しく見えます。415は「サポートされていないメディアタイプ」応答です。これは、要求コンテンツタイプが、ビュー用に構成されたパーサーのいずれによっても処理できるものではなかったことを意味します。

通常、このような場合は、リクエストのコンテンツタイプを設定し忘れたことが原因ですが、正しく設定されているようです。multipart/form-data; boundary=...

再確認すること:

  • response.dataエラーの詳細として正確に何が表示されますか?
  • 設定で何を構成しましたかDEFAULT_PARSER_CLASSES(ある場合)、またはビュー属性に何を設定しましたparser_classesか(ある場合)。
  • content_typeテストにタイプミスがないことを確認してください(ここでは正しいですが)。

編集

コメントありがとうございます-それはすべてをクリアします。JSONパーサーのみがインストールされていますが、フォームでエンコードされたデータを送信しようとしています。次のいずれかを行う必要があります。

  • を設定/ビューに追加FormParserMultiPartParserて、フォームエンコーディングをサポートするようにします。(デフォルトDEFAULT_PARSER_CLASSES設定にはそれら含まれていることにも注意してください。何も設定しない場合は、期待どおりに機能します)

または

  • テストケースでは、jsonフォームエンコーディングではなくエンコーディングを使用してリクエストをエンコードします。data=json.dumps(prepare_dict(self.account)), content_type='application/json'
于 2013-03-01T09:13:06.847 に答える