2017-02-03 7 views
1

Django ModelFormsetの検証/クリーンな部分を単体テストする最良の方法は何ですか?私のformsetはフォームの値に基づいていくつかのバリデーションを行うきれいなメソッドを持っています。私はそれに対して単体テストをしたいのです。総称化コードのようになります。ユニットテストdjango ModelFormsetクリーンメソッド

class AForm(ModelForm): 
    a = ChoiceField(choices=CHOICES) 
    b = FloatField() 

    def __init__(self, *args, **kwargs): 
     super(AForm, self).__init__(*args, **kwargs) 

    class Meta: 
     model = AModel 
     fields =['a', 'b'] 


class AFormset(BaseInlineFormSet): 

    def clean(self): 
     # Some logic to validate relationships between the forms  

しかし、フォームのテスト中には重要ではありません。その後、form = AForm(formdata)とデータに基づいて、その有効性やエラーを検証します。私はformsetのテストを書くのに問題があります。

私が試してみた:

formset = AFormset() 

と引数とモック(例えば、クエリセット)の様々な組み合わせでmodelformset_factory

Formset = modelformset_factory(AModel, AForm, formset=AFormset, fields=('a', 'b')) 
formset = Formset(formdata) 

を使用。しかし、私は常に、モデルの外部キーまたは主キーに関連するエラーを取得します。一例:

Error Traceback (most recent call last): 
File "/tests/test_forms.py", line 62, in test_validation formset = Formset(formdata) 
File "lib/python2.7/site-packages/django/forms/models.py", line 853, in __init__ 
self.instance = self.fk.rel.to() 
AttributeError: 'AFormset' object has no attribute 'fk' 

私は何が欠けていますか?データの辞書でフォームセットをインスタンス化し、そのcleanメソッドを実行する簡単な方法はありますか?私はフォームが使用されているビューをテストすべきですか? (ビューで私はDjango Extra Viewsパッケージでフォームとフォームセットを使用しています)

+1

*正確に*あなたはそのエラーを取得していますか?テストの完全なコードを示してください。 –

+0

@DanielRosemanトレースバックを含めるように質問を更新しました。私はそれをどのようにテストしているかに基づいて異なるエラーを取得しますが、それらはすべて関連するモデルのdb機能に関連しています。関連するすべてのモデルのモックを設定せずにフォームセットをテストすることはできません – ComeAlongBort

答えて

0

問題はテストではなく、ベースフォームセットクラスとフォームセットファクトリの間に互換性がないことが関係しています。

あなたのAFormsetクラスは、BaseInlineFormSetから継承されます。そのクラスはfkプロパティが存在することを期待しています。これはフォームモデルの外部キーを "インライン"であるオブジェクトに決定する必要があります。そのプロパティはinlineformset_factory関数によって作成されます。ただし、具体的なフォームセットクラスを構築するのにmodelformset_factoryを使用しています。これは、fkプロパティを設定しません。

inlineformset_factoryを使用して(親モデルを渡す)、実際にインラインでない場合は、BaseModelFormSetから継承するようにフォームセットクラスを変更する必要があります。

関連する問題