Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django何时使用拆卸方法_Django - Fatal编程技术网

Django何时使用拆卸方法

Django何时使用拆卸方法,django,Django,根据文件: 另一方面,测试用例不会截断表并重新加载 测试开始时的初始数据。相反,它包含测试 在事务结束时回滚的数据库事务中的代码 测试。它还防止被测代码发出任何提交或 在数据库上执行回滚操作,以确保 测试结束时,将数据库恢复到其初始状态。在里面 以确保所有测试用例代码都以干净的 数据库中,Django测试运行程序首先运行所有测试用例测试,然后 任何其他可能在无需更改数据库的情况下更改数据库的测试(如doctest) 将其恢复到原始状态 因此,如果我有一个类似这样的测试: class Genera

根据文件:

另一方面,测试用例不会截断表并重新加载 测试开始时的初始数据。相反,它包含测试 在事务结束时回滚的数据库事务中的代码 测试。它还防止被测代码发出任何提交或 在数据库上执行回滚操作,以确保 测试结束时,将数据库恢复到其初始状态。在里面 以确保所有测试用例代码都以干净的 数据库中,Django测试运行程序首先运行所有测试用例测试,然后 任何其他可能在无需更改数据库的情况下更改数据库的测试(如doctest) 将其恢复到原始状态

因此,如果我有一个类似这样的测试:

class GeneralUserCreateTest(TestCase):

    def setUp(self):
        create_roletypes()
        create_permissiontypes()
        self.client = Client()
        self.event = create_event()

    def test_create(self):
        create_url = reverse('event_user_signup', args=[self.event.slug])

        post_data = {
            'signup-account-email': 'foo@bar.com',
            'signup-account-password': 'foobar',
            'signup-account-password2': 'foobar',
            'signup-account-first_name': 'Foo',
            'signup-account-last_name': 'Bar',
        }
        response = self.client.post(create_url, data=post_data)
        self.assertEqual(response.status_code, 302)

        # check creation of user object
        self.assertEqual(User.objects.filter(email=post_data['signup-account-email']).count(), 1)
        user = User.objects.get(username=post_data['signup-account-email'])

        # user and profile objects created
        self.assertEqual(User.objects.all().count(), 1)
        self.assertEqual(Profile.objects.all().count(), 1)

        # get the first user and profile object to test against submitted field
        user = User.objects.all()[0]
        profile = Profile.objects.all()[0]
        role = Role.objects.filter(event=self.event, profiles=profile)[0]
        self.assertEqual(role.roletype.name, 'General')
        self.assertEqual(user.username, post_data['signup-account-email'])
        self.assertEqual(user.email, post_data['signup-account-email'])
        self.assertEqual(profile.first_name, post_data['signup-account-first_name'])
        self.assertEqual(profile.last_name, post_data['signup-account-last_name'])

仍然需要运行
teardown
方法吗,还是
TestCase
类会处理它?如果是这样,考虑到
TestCase
类的可用性,什么时候应该使用
teardown
方法?

对于数据库而言,
teardown
是毫无意义的,因为每个测试都在一个事务中运行。然而,并非测试中的所有内容都涉及数据库。您可能会测试文件创建/读取、派生过程、开放网络连接等。这些类型的事情通常要求您在完成后“关闭”它们。这就是
拆卸
的目的,即从
设置
方法中清理与数据库无关的内容。(不过,如果您实际上是直接连接到数据库,也就是说,实际的Django测试必须确保所有DBAPI工作正常,那么您也需要在那里进行清理。)

如果您使用的是MongoDB或Redis等替代数据库,并且需要加载一组初始数据(“集合”),您还需要重写
tearDown
方法

通常,
django.test.TestCase
会在每次启动时刷新整个数据库 新测试。这意味着我们不需要像上面Chris Pratt提到的那样手动删除拆卸中的对象。下一个测试设置将确保数据库是干净的

但是,如果我们使用doctest和
unittest.TestCase
,则在再次运行测试之前不会刷新数据库。在测试开始时,数据库将处于前一个测试的任何状态 左测试。这意味着上一次运行留下的任何散乱数据都会导致冲突。因此,如果我们在django测试中使用doctest或unittest.TestCase,那么清理可能是一种好的做法


最后,在更复杂的场景中,故意持久化测试数据库以查找特定的单元测试错误也是有意义的,我需要删除测试创建的文件,
tearDown
方法在这种情况下非常有用

import shutil

#....
#....

    def tearDown(self):
        shutil.rmtree(settings.UPLOAD_ROOT)

我发现
TestCase
并不总是刷新数据库。。。我不确定这是什么原因造成的,但有几次我不得不使用
TransactionTestCase
在测试之间重置数据库。我不同意您关于查找单元测试错误的最后一点。原则上,单元测试是独立的,所以所有内容都应该包含在单元测试中,对吗?在之前或之后执行测试不应影响当前单元测试的运行。您能否解释一个可能需要在测试之间保存数据的复杂场景示例?