【问题标题】:Django: How to unit test Update Views/FormsDjango:如何对更新视图/表单进行单元测试
【发布时间】:2016-12-16 00:04:24
【问题描述】:

我正在尝试对我的更新表单和视图进行单元测试。我在创建和更新表单中都使用了 Django Crispy Forms。 UpdateForm 继承了 CreateForm 并对提交按钮文本进行了小幅改动。 CreateView 和 UpdateView 非常相似。它们具有相同的模型、模板和success_url。它们的区别在于使用各自的表单,CreateView 继承 django.views.generic.CreateView,UpdateView 继承 django.views.generic.edit.UpdateView。

网站运行良好。我可以毫无问题地创建和编辑对象。但是,下面显示的我的第二个测试失败了。如何测试我的 UpdateForm?

任何帮助将不胜感激。谢谢。

此测试通过:

class CreateFormTest(TestCase):

    def setUp(self):
        self.valid_data = {
            'x': 'foo',
            'y': 'bar',
        }

    def test_create_form_valid(self):
        """ Test CreateForm with valid data """
        form = CreateForm(data=self.valid_data)
        self.assertTrue(form.is_valid())
        obj = form.save()
        self.assertEqual(obj.x, self.valid_data['x'])

此测试失败:

class UpdateFormTest(TestCase):
    def setUp(self):
        self.obj = Factories.create_obj()  # Creates the object

    def test_update_form_valid(self):
        """ Test UpdateForm with valid data """
        valid_data = model_to_dict(self.obj)
        valid_data['x'] = 'new'
        form = UpdateForm(valid_data)
        self.assertTrue(form.is_valid())
        case = form.save()
        self.assertEqual(case.defendant, self.valid_data['defendant']

【问题讨论】:

  • 我很确定你要找的是form = UpdateForm(instance=self.obj)
  • 成功了。谢谢!如果您提供答案,我会接受。

标签: python django forms unit-testing


【解决方案1】:

使用已创建的对象预填充ModelForm 时,您可以使用instance 关键字参数将对象传递给表单。

form = SomeForm(instance=my_obj)

这可以在测试中完成,例如在 OPsave() 时,现有对象将更新,而不是创建新对象。

【讨论】:

  • 那是一个未绑定的表单。在它上面调用is_valid 将返回False 而没有错误。
猜你喜欢
  • 2010-11-24
  • 1970-01-01
  • 2012-03-29
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2013-05-08
  • 2017-04-12
相关资源
最近更新 更多