Python Django单元测试不修改数据库

Python Django单元测试不修改数据库,python,django,python-3.x,unit-testing,django-unittest,Python,Django,Python 3.x,Unit Testing,Django Unittest,我正在为视图PersonRemoveView创建一个单元测试,该视图只修改名为Delete\u date的模型中名为Person的日期时间字段。在执行此视图之前,此字段为None,然后将其设置为timezone.now() 问题在于,从单元测试执行视图后,deletation\u date的值为None 这就是测试: def test\u person\u remove\u视图(self): person=models.person.objects.get(pk=1) request=self.

我正在为视图
PersonRemoveView
创建一个单元测试,该视图只修改名为
Delete\u date
的模型中名为
Person
的日期时间字段。在执行此视图之前,此字段为
None
,然后将其设置为
timezone.now()

问题在于,从单元测试执行视图后,
deletation\u date
的值为
None

这就是测试:

def test\u person\u remove\u视图(self):
person=models.person.objects.get(pk=1)
request=self.factory.post('/person/remove/{}.format(person.id))
response=PersonRemoveView.as_view()(请求,pk=person.id)
self.assertsnotnone(person.deletation\u 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
方法按预期执行,但临时测试数据库没有更改,
assertsnotnone
方法失败

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

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)

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

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)

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

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