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),以从数据库中获取最新的更改。
我正在为视图 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),以从数据库中获取最新的更改。