补丁后 Django 不一致测试
Django Inconsistent Test after Patch
我在 patch
之后得到的结果不一致。我正在尝试比较修补后的结果。我想在打补丁时将数据删除之前将数据存储在变量中。当我尝试在修补后打印数据时,它会得到新的不同结果。下面,我要将老狗存入old
。但是在补丁之后,它会更新为新值,例如 new
。我的补丁序列化程序在打补丁时删除了旧记录。
#models.py
class Owner(models.Model):
owner = models.CharField()
class Dog(models.Model):
owner = models.ForeignKey(Owner,on_delete=models.CASCADE)
name = models.CharField()
#test.py
class Update(APITestCase):
def test_update_dog(self):
old = Dog.objects.filter(owner=1).order_by('id')
print(old) # <QuerySet [<Dog: Ben>, <Dog: Phoebe>]>
data = {
'dogs': [
{'name': 'Ryan'},
{'name': 'Louis'}
]
}
response = self.client.post(
'/admin/login/', {'username': 'admin', 'password': 'password123'})
response = self.client.patch('/app/dogs/1/',
data=data,
format='json')
new = Dog.objects.filter(owner=1).order_by('id')
print(new) # <QuerySet [<Dog: Ryan>, <Dog: Louis>]>
print(old) # <QuerySet [<Dog: Ryan>, <Dog: Louis>]>
self.assertNotEqual(old[0].name, new[0].name)
self.assertNotEqual(old[1].name, new[1].name)
原因是 Django 中的查询集是 lazy。当您将旧结果存储在变量中时,并不意味着实际执行了任何 DB activity。您可以只存储属性值并像这样进行检查:
old = Dog.objects.filter(owner=1).order_by('id').values('id', 'name')
...
self.assertNotEqual(old, new.values('id', 'name'))
我在 patch
之后得到的结果不一致。我正在尝试比较修补后的结果。我想在打补丁时将数据删除之前将数据存储在变量中。当我尝试在修补后打印数据时,它会得到新的不同结果。下面,我要将老狗存入old
。但是在补丁之后,它会更新为新值,例如 new
。我的补丁序列化程序在打补丁时删除了旧记录。
#models.py
class Owner(models.Model):
owner = models.CharField()
class Dog(models.Model):
owner = models.ForeignKey(Owner,on_delete=models.CASCADE)
name = models.CharField()
#test.py
class Update(APITestCase):
def test_update_dog(self):
old = Dog.objects.filter(owner=1).order_by('id')
print(old) # <QuerySet [<Dog: Ben>, <Dog: Phoebe>]>
data = {
'dogs': [
{'name': 'Ryan'},
{'name': 'Louis'}
]
}
response = self.client.post(
'/admin/login/', {'username': 'admin', 'password': 'password123'})
response = self.client.patch('/app/dogs/1/',
data=data,
format='json')
new = Dog.objects.filter(owner=1).order_by('id')
print(new) # <QuerySet [<Dog: Ryan>, <Dog: Louis>]>
print(old) # <QuerySet [<Dog: Ryan>, <Dog: Louis>]>
self.assertNotEqual(old[0].name, new[0].name)
self.assertNotEqual(old[1].name, new[1].name)
原因是 Django 中的查询集是 lazy。当您将旧结果存储在变量中时,并不意味着实际执行了任何 DB activity。您可以只存储属性值并像这样进行检查:
old = Dog.objects.filter(owner=1).order_by('id').values('id', 'name')
...
self.assertNotEqual(old, new.values('id', 'name'))