Django测试增加pk问题

时间:2012-11-02 22:10:10

标签: django django-testing

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

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?

2 个答案:

答案 0 :(得分:1)

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

您可以直接询问第一个元素:Project.objects.all()[0],而不是对pk编号进行硬编码。由于您使用空表开始每次测试运行,因此可以保证为您提供所需的项目。

答案 1 :(得分:0)

如果真的希望这将是数据库中唯一的对象,您可以检索它:

result1 = Project.objects.get()

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

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

那将检索最后一个对象。