【发布时间】:2017-06-21 03:19:19
【问题描述】:
对 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 = 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 包的表单和表单集)
【问题讨论】:
-
你在哪里确切地得到那个错误?请展示完整的测试代码。
-
@DanielRoseman 我更新了问题以包含回溯。根据我的测试方式,我得到了不同的错误,但它们都与相关模型的数据库功能有关。如果不为所有相关模型设置模拟,是否无法测试表单集
标签: python django forms unit-testing