为什么我的POST请求在我的单元测试中没有按预期重定向,即使没有表单错误?

时间:2013-10-17 20:40:19

标签: django redirect django-forms http-post django-unittest

我有一个带有表单的Django视图,我在单元测试中发布了这个视图。这是测试的一般结构:

class ViewTests(TestCase):
    form_url = reverse_lazy('myapp:form')
    success_url = reverse_lazy('myapp:success')

    def test_form_submission_with_valid_data_creates_new_object_and_redirects(self):
        attributes = EntryFactory.attributes()
        attributes['product'] = ProductFactory()  # Entry has a ForeignKey to Product
        response = self.client.post(self.form_url, attributes, follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertRedirects(response, self.success_url)
        self.assertTemplateUsed(response, 'myapp/success.html')

但是,我似乎无法弄清楚为什么重定向不能按预期工作。我已尝试放入import pdb; pdb.set_trace()以查看是否存在任何表单错误(response.context['form'].errors),但我得到的所有内容都是空字典。在浏览器中提交表单会正确地重定向,因此我不确定单元测试失败的原因,也不确定如何正确调试它,因为表单错误字典中没有出现错误。

1 个答案:

答案 0 :(得分:0)

原来有一些错误。

首先,我错过了页面上的第二个表单(用于选择Product)。相关地,我应该将ProductFactory().id分配给attributes['product'],而不是ProductFactory

其次,在我改变了这一点之后,assertRedirects出现了问题;我必须将self.success_url更改为unicode(self.success_url),因为assertRedirects无法与代理进行比较。

最终产品:

def test_form_submission_with_valid_data_create_new_entry_and_redirects(self):
    attributes = EntryFactory.attributes()
    attributes['product'] = ProductFactory().id
    response = self.client.post(self.form_url, attributes)
    self.assertRedirects(response, unicode(self.success_url))