Django 测试递增 pk 问题



所以我有一个测试类,它有一个设置方法,可以创建一个可以测试的模型对象:

class UserProjectTests(TestCase):
fixtures = ['admin_test.json']
def setUp(self):
...
self.project1 = Project.objects.create(
user=self.user_profile1,
product=self.product1,
module=self.module1,
model=self.model1,
zipcode=90210
)
self.project1.save()
def test_module_created(self):
...
def test_model_created(self):
...
def test_product_created(self):
...
def test_project_created(self):
#! what happened to pk<4???
result1 = Project.objects.get(pk=4)
self.assertEquals(result1.zipcode, 90210)
def test_user_cannot_edit_project_they_dont_own(self):
...

我的问题是 - 为什么我必须调用pk=4才能获取测试数据库中的唯一对象?如果我将此测试向上移动几个函数,则我必须查询才能通过测试的 pk 会减少。似乎每次运行安装程序时,它都不会以原始数据库开头,因为 pk 是自动递增的。

谁能告诉我这是为什么?我应该怎么做才能使用 pk=1,无论它出现在哪个测试函数中?

Django 的测试运行器在每次测试后刷新数据库,它不会删除它并重新创建它 - 这会大大减慢测试速度。

与其硬编码 pk 数字,不如只要求第一个元素:Project.objects.all()[0]。由于每次测试运行开始时都使用空表,因此可以保证为您提供所需的项。

如果确实预期这将是数据库中唯一的对象,您可以像以下方式检索它:

result1 = Project.objects.get()

如果找到多个(或没有)对象,这将引发错误。这样做可能更安全:

result1 = Project.objects.all()[-1]

这将检索最后一个对象。

最新更新