python Django中的数据库在测试之间不更新

wlsrxk51  于 2023-05-27  发布在  Python
关注(0)|答案(2)|浏览(117)

我试图运行一个创建测试,然后进行更新,但在第二个测试中,我无法找到在第一个测试中创建的对象。我已经意识到这是因为直到两个测试都运行之后,对象才被添加到DB中。有人知道这是为什么吗?如何运行一个创建测试,然后运行一个使用创建测试中创建的对象的更新测试?

from unittest import TestCase

class QuantsTests(TestCase):
     def setUp(self):
          self.factory = RequestFactory()

     def test_create_object(self):
          object = Object()
          object.name = "123456789"
          object.save()

     def test_update_object(self):
          Object.objects.filter(name="123456789")

Error: object.models.Model.DoesNotExist: Object matching query does not exist.
1wnzp6jl

1wnzp6jl1#

每个测试都在自己的环境中运行:在每次测试之前,重置系统的状态(包括数据库)并执行setup()函数。这样做是为了确保一个测试的执行不会影响其他测试的结果。
如果所有测试都需要数据库中的相同对象,则可以在setup()函数中移动添加这些对象的代码。否则,每个测试都应该从向数据库添加所需的所有对象开始。一个中间的解决方案是创建一些函数,将一些对象添加到数据库中,这样您就不需要在所有需要数据库中某些条件的测试中编写完全相同的代码。

unftdfkk

unftdfkk2#

Django测试在每个测试方法后重置。所以你现在的流程是

QuantsTests -> SetUp -> create_object -> Rollback
QuantsTests -> SetUp -> update_object -> Rollback

您可以使用subTests和单个方法,这是我在测试类似的东西时通常使用的方法

class QuantsTests(TestCase):
    def setUp(self):
        self.factory = RequestFactory()

        def test_object(self):
            created = False

    with self.subTest('Create'):
        object = Object()
        object.name = "123456789"
        object.save()
        created = True

    if created:
        # No point of running + failing this one if the previous one failed.
        #   hence the check
        with self.subTest('Update'):
            Object.objects.filter(name="123456789")
注意:

正常的python unittest不会在每个方法后回滚。只是一些值得纪念的东西

相关问题