Djangoフォームセットユニットテスト



Django Formset Unit Test



解決:

特に、ManagmentFormバリデーターがPOSTされる次のアイテムを探していることがわかりました。

form_data = {'form-TOTAL_FORMS':1、 'form-INITIAL_FORMS':0} 

すべてのDjangoフォームセットには、投稿に含める必要のある管理フォームが付属しています。公式ドキュメントはそれをかなりよく説明しています。ユニットテストで使用するには、自分で書き出す必要があります。 (私が提供したリンクは例を示しています)、または電話データを出力するformset.management_form。




実際、応答のコンテキストを調べることで、フォームセットにあるものを簡単に再現できます。

以下のコードを検討してください(self.clientは通常のテストクライアントです):



url = 'some_url' response = self.client.get(url)self.assertEqual(response.status_code、200)#データはすべてのフォームを受け取りますフィールド名#キーはフィールド名になります( 'formx-fieldname'として)、値は文字列表現になります。 data = {}#グローバル情報、いくつかの追加フィールドがそこに移動する場合がありますdata ['csrf_token'] = response.context ['csrf_token']#フォームセットmanagement_form = response.context ['form']のために必要な管理フォーム情報。 management_form for i in'TOTAL_FORMS '、' INITIAL_FORMS '、' MIN_NUM_FORMS '、' MAX_NUM_FORMS ':data ['%s-%s '%(management_form.prefix、i)] = management_form [i] .value()for i in range(response.context ['form']。total_form_count()):#フォームインデックスを取得 'i' current_form = response.context ['form']。forms [i]#current_form.fieldsのfield_nameのすべてのフィールドを取得します。 value = current_form [field_name] .value()data ['%s-%s'%(current_form.prefix、field_name)] =値がNoneでない場合の値else ''#stdoutにフラッシュアウトprint '#' * 30 for i insorted(data.keys()):print i、 ' t:'、data [i]#変更なしでリクエストを投稿するresponse = self.client.post(url、data)

重要な注意点

変更した場合呼び出す前のデータself.client.post、DBを変更している可能性があります。結果として、その後のself.client.getは、特に管理フォームとフォームセット内のフォームの順序について、同じデータを生成しない場合があります(基になるクエリセットに応じて異なる順序になる可能性があるため)。この意味は

  • 変更した場合data [form-3-somefield]と呼び出しself.client.get、これと同じフィールドが次のように表示される場合がありますdata [form-8-somefield]、
  • 変更した場合の前のデータself.client.post、呼び出すことはできません同じもので再びself.client.postデータ:あなたは電話する必要がありますself.client.getと再構築再びデータ。