1

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

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?

4

2 回答 2

2

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

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

于 2012-11-02T22:15:58.630 回答
1

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

result1 = Project.objects.get()

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

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

这将检索最后一个对象。

于 2012-11-02T22:15:48.667 回答