你如何在Django中测试formset?

时间:2013-05-14 13:12:21

标签: django unit-testing formset

好的,所以我需要在视图中对视图进行单元测试,更精确的形式。所以我创建了这样一个单元测试。

class ViewTest(TestCase):
    fixtures = ['fixture.json']
    def setUp(self):
        self.client = Client()
    def test_company_create(self):
        post_data = {
            'form-0-user': '',
            'form-0-share': '',
            'form-TOTAL_FORMS': 1,
            'form-INITIAL_FORMS': 0,
            'form-MAX_NUM_FORMS': 10
        }
    resp = self.client.post('/company/create/', post_data)
    self.assertFormError (resp, 'shareholder_formset', 'share', 'This field is required.')
    self.assertFormError (resp, 'shareholder_formset', 'user', 'This field is required.')

当然我收到了错误

  

AttributeError:'ShareholderFormFormSet'对象没有属性   '字段'

因为formset中有表单,而不是字段.....那么测试表单集的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

这是一个功能测试(因为你通过视图,如果保存它可能请求模型等)。

对于表单,django-webtest更容易使用;你不必担心这些细节: https://pypi.python.org/pypi/django-webtest

答案 1 :(得分:0)

正如您所指出的,assertFormError中的表单名称参数实际上只是response.context_data中的一个键。您正在使用的密钥返回formset中的表单列表。正如您所发现的,它不适用于assertFormError。

一种选择是使用assertEqual并进行直接比较。类似的东西:

self.assertEqual(response.context_data[u'shareholder_formset'][form_index].errors['share'], 'This field is required.')

我还想提一下,我的IDE(PyCharm)帮助解决了这个问题。我正在研究类似的问题。打开调试器,在调用post()之后设置一个断点并检查响应,给出了解决方案。

答案 2 :(得分:0)

Django现在已经实现了assertFormsetError

django-basetestcase具有一项功能,可让您测试formset之外的view,而不需要response

formset = MyFormSet(formset_data)

self.formset_error_test(
    formset,
    form_index=3,
    field='my_field',
    message='My error message.'
)
相关问题