2017-02-03 56 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' 

我在想什麼?有沒有一種更簡單的方法來實例化一個數據字典的formset並讓它運行它的方法clean?我應該只測試表單用於的視圖嗎? (在使用Django Extra Views包的表單和表單集的視圖中)

+1

哪裏*確切*你得到那個錯誤?請顯示測試的完整代碼。 –

+0

@DanielRoseman我更新了問題以包含回溯。基於我如何測試它,我得到了不同的錯誤,但它們都與相關模型的數據庫功能有關。如果沒有爲所有相關模型設置模擬,是否無法測試formset? – ComeAlongBort

回答

0

問題不在於您的測試,而是與基本formset類和formset工廠之間的不兼容。

你AFormset類從BaseInlineFormSet繼承。該類預期存在fk屬性,該屬性應該確定表單模型的外鍵與「內聯」的對象的外鍵。該屬性由inlineformset_factory函數創建。但是,您正在使用modelformset_factory來構建您的具體formset類;這並沒有設置fk屬性。

您應該使用inlineformset_factory(並傳入父模型),或者如果它不是實際內聯,則將您的formset類更改爲從BaseModelFormSet繼承。