好的,所以我需要在视图中对视图进行单元测试,更精确的形式。所以我创建了这样一个单元测试。
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中有表单,而不是字段.....那么测试表单集的正确方法是什么?
答案 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.'
)