Django单元测试未修改数据库

2024-09-30 06:34:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个视图PersonRemoveView创建一个单元测试,它只修改名为Person的模型中名为deletion_date的日期时间字段。此字段是None,直到执行此视图,然后将其设置为timezone.now()

问题是在从单元测试执行视图之后,deletion_date的值是None。在

这是测试:

def test_person_remove_view(self): person = models.Person.objects.get(pk=1) request = self.factory.post('/person/remove/{}'.format(person.id)) response = PersonRemoveView.as_view()(request, pk=person.id) self.assertIsNotNone(person.deletion_date)

这是一个观点:

class PersonRemoveView(PermissionRequiredMixin, generic.DeleteView):
    model = Person
    success_url = reverse_lazy('control:person_list')

   def dispatch(self, request, *args, **kwargs):
       self.object = self.get_object()
       self.object.deletion_date = timezone.now()
       self.object.save()
       return HttpResponseRedirect(self.success_url)

我一直在调试,dispatch方法按预期执行,但临时测试数据库没有更改,assertIsNotNone方法失败


Tags: selfnone视图dateobjectrequestdef单元测试
2条回答

在测试中,从数据库中获取Person实例,然后执行视图,该视图修改数据库,但不修改之前检索的对象。您需要在执行视图之后调用person.refresh_from_db()documentation),以从数据库中获取最新的更改。在

模型实例不共享,因此您必须在测试中重新加载实例,以确定视图是否正确更改了基础数据库记录:

def test_person_remove_view(self):
    person = models.Person.objects.get(pk=1)
    request = self.factory.post('/person/remove/{}'.format(person.id))
    response = PersonRemoveView.as_view()(request, pk=person.id)
    # reloads our instance values from the database
    person.refresh_from_db()
    self.assertIsNotNone(person.deletion_date)

相关问题 更多 >

    热门问题