Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单元测试django ModelFormset清理方法_Python_Django_Forms_Unit Testing - Fatal编程技术网

Python 单元测试django ModelFormset清理方法

Python 单元测试django ModelFormset清理方法,python,django,forms,unit-testing,Python,Django,Forms,Unit Testing,对Django模型集的验证/清理部分进行单元测试的最佳方法是什么?我的表单集有一个干净的方法,它根据表单的值进行一些验证,我想对它进行单元测试。一般化代码如下所示: class AForm(ModelForm): a = ChoiceField(choices=CHOICES) b = FloatField() def __init__(self, *args, **kwargs): super(AForm, self).__init__(*args, *

对Django模型集的验证/清理部分进行单元测试的最佳方法是什么?我的表单集有一个干净的方法,它根据表单的值进行一些验证,我想对它进行单元测试。一般化代码如下所示:

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\u工厂

Formset = modelformset_factory(AModel, AForm, formset=AFormset, fields=('a', 'b'))
formset = Formset(formdata)
使用参数和模拟的各种组合(实例、queryset)。但我总是会遇到与模型外键或主键相关的错误。一个例子:

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
方法?我是否应该测试表单在中使用的视图?(在视图中,我将表单和表单集与包一起使用)

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

您的AFormset类继承自BaseInlineFormSet。该类要求存在一个
fk
属性,该属性应确定表单模型的外键与它“内联”到的对象。该属性由
inlineformset\u工厂
函数创建。但是,您正在使用
modelformset\u factory
构建具体的formset类;这不会设置
fk
属性


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

问题不在于测试,而在于基formset类和formset工厂之间的不兼容

您的AFormset类继承自BaseInlineFormSet。该类要求存在一个
fk
属性,该属性应确定表单模型的外键与它“内联”到的对象。该属性由
inlineformset\u工厂
函数创建。但是,您正在使用
modelformset\u factory
构建具体的formset类;这不会设置
fk
属性


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

您从何处得到该错误?请显示测试的完整代码。@DanielRoseman我更新了问题以包含回溯。根据我测试它的方式,我会得到不同的错误,但它们都与相关模型的db功能有关。在没有为所有相关模型设置模拟的情况下测试表单集是不可能的吗?请显示测试的完整代码。@DanielRoseman我更新了问题以包含回溯。根据我测试它的方式,我会得到不同的错误,但它们都与相关模型的db功能有关。在没有为所有相关模型设置模拟的情况下,是否不可能测试表单集