2016-08-05 6 views
0

Djangoフォームの単体テストの作成には少し問題があります。私は実際にはis_valid()メソッドをチェックし、例を見たがっているが、私のコードは機能していない。そして、Googleで1日かそこらを読んだ後、私はまだ私が探している答えを見つけることができなかった。以下は、私がテストケースを実行したときに私が得る唯一のもの」でありforms.pyとtest_forms.pyDjangoフォームのユニットテストでChoiceFieldとMultipleChoiceFieldが失敗しましたis_valid()

forms.py

class DataSelectForm(forms.Form): 
    #these are done in the init funct. 
    result_type = forms.ChoiceField(widget=forms.Select(attrs={'class': 'field-long'})) 
    band_selection = forms.MultipleChoiceField(widget=forms.SelectMultiple(attrs={'class': 'multiselect field-long'})) 
    title = forms.CharField(widget=forms.HiddenInput()) 
    description = forms.CharField(widget=forms.HiddenInput()) 

    def __init__(self, result_list=None, band_list=None, *args, **kwargs): 
     super(DataSelectForm, self).__init__(*args, **kwargs) 
     if result_list is not None and band_list is not None: 
      self.fields["result_type"] = forms.ChoiceField(choices=result_list, widget=forms.Select(attrs={'class': 'field-long'})) 
      self.fields["band_selection"] = forms.MultipleChoiceField(widget=forms.SelectMultiple(attrs={'class': 'multiselect field-long'}), choices=band_list 

test_forms.py

def test_data_select_form(self): 
     results = ResultType.objects.all() 
     results_value = [] 
     for result in results: 
      results_value.append(result.result_type) 
     bands = SatelliteBand.objects.all() 
     bands_value = [] 
     for band in bands: 
      bands_value.append(band.band_name) 
     form_data = {'result_type': results_value, 'band_selection': bands_value, 'title': 'a title', 'description': 'some description'} 
     form = DataSelectForm(data = form_data) 

     print(form['title'].value()) 
     print(form['description'].value()) 
     print(form['result_type'].value()) 
     print(form['band_selection'].value()) 

     self.assertTrue(form.is_valid()) 

ためのコードがありますAssertionError:Falseは真ではありません "私はエラーを理解しています、なぜ私はそれを取得していません。私はすべてのデータを渡しています。私はprint文を実行するとそれを見ることができます。私はresult_typeとband_selectionを取って、それをform_dataの一部ではなくコンストラクタに渡そうとしましたが、どちらもうまくいきませんでした。私は何が欠けていますか?

+1

アサーションステートメントの前に '' 'form.is_valid();を追加します。 print(form.errors) '' ' –

+0

テストを最小限にして、動作させるために必要な最小限のデータを考えてください。 bands_valueの代わりに、['test band name]]を使うだけで、設定バンドとbands_valueのラインのヒープを削除することができます。これにより、テストがより速く読みやすくなります。 –

答えて

2

フォームを作成するときにresult_listband_listを渡す必要があります。

# These aren't the actual choices you want, I'm just showing that 
# choices should be a list of 2-tuples. 
result_list = [('result1', 'result1'), ('result2', 'result2'), ...] 
band_list = [('band1', 'band1'), ('band2', 'band2'), ...] 

DataSelectForm(result_list=result_list, band_list=band_list, data=form_data) 

値をフォームに渡さない場合は、フィールドの選択肢を設定しません。フィールドに選択肢がない場合、data dictの値は有効ではないため、フォームは常に無効になります。

+0

result_listとband_selectionにページに表示されるタプルのリストを埋め込むことをお勧めしましたが、このエラーが発生します: TypeError:__init __()は予期しないキーワード引数 'result_type'を持っています –

+0

あなたの '__init__'メソッドのように、' band_list'と 'result_list'でなければなりません。 – Alasdair

+0

__init__に情報を渡すか、form_dataの一部として情報を渡そうとしましたが、決して両方ではありません。フォームがどのようにテストされるかをより明確に理解していることは間違いありません。 –

関連する問題