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