【问题标题】:unit testing django ModelFormset clean methods单元测试 django ModelFormset 清理方法
【发布时间】: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


【解决方案1】:

问题不在于您的测试,而与您的基本表单集类和表单集工厂之间的不兼容有关。

您的 AFormset 类继承自 BaseInlineFormSet。该类期望存在一个fk 属性,它应该确定表单模型的外键到它“内联”的对象。该属性由inlineformset_factory 函数创建。但是,您正在使用 modelformset_factory 来构造您的具体表单集类;这不会设置 fk 属性。

您应该使用inlineformset_factory(并传入父模型),或者将您的表单集类更改为从 BaseModelFormSet 继承(如果它实际上不是内联的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-14
    • 2012-11-09
    • 2022-10-06
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    相关资源
    最近更新 更多