Django 单元测试不修改数据库

Django unit test not modifying database

我正在为视图 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方法失败

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

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_from_db() (documentation),以从数据库中获取最新的更改。