2013-05-14 58 views
6

好的,所以我需要单元测试一个视图,在视图中更精确的形式。所以我创建了这样一个单元测试。你如何在Django中测试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.') 

Ofcourse我回来一个错误

AttributeError: 'ShareholderFormFormSet' object has no attribute 'fields'

因为表单集有它的形式,而不是场.....那么什么是测试一个formset正确的方法是什么?

+0

看看类似的问题:http://stackoverflow.com/questions/1630754/django-formset-unit-test。 – alecxe 2013-05-14 14:32:01

+0

@alecxe这个问题仅仅是在类似于formset和unit-testing的意义上相似...... @Viktor只是测试'ShareholderForm'呢?它看起来就是你正在试图用你的断言来做的...... – Ngenator 2013-05-14 14:33:17

+0

你既在这个“单元”测试中测试视图和表单。没有必要做POST来测试表单。请参阅[在Django#2中测试指南]中的“测试表单”部分(http://toastdriven.com/blog/2011/apr/17/guide-to-testing-in-django-2/) – gertvdijk 2013-05-14 14:39:06

回答

2

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

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

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()并检查响应之后放置一个断点,给出了解决方案。