7

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

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里面有表单,而不是字段......那么测试formset的正确方法是什么?

4

3 回答 3

2

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

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

于 2013-09-04T00:51:47.200 回答
1

Django 现在已经实现了一个assertFormsetError

django-basetestcase有一个功能可以让你测试formset除了.viewresponse

formset = MyFormSet(formset_data)

self.formset_error_test(
    formset,
    form_index=3,
    field='my_field',
    message='My error message.'
)
于 2019-04-06T02:12:23.970 回答
0

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

一种选择是使用 assertEqual 并进行直接比较。就像是:

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

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

于 2014-08-15T22:39:18.683 回答