在setUpClass中访问Django测试客户端

Nic*_*ris 3 python testing django

我有一个测试类,我想创建并登录用户一次:

class UserModelTest(TestCase):
    fixtures = ['group_perms']

    @classmethod
    def setUpClass(cls):
        cls.standard_user = UserFactory(first_name='Firsto', last_name='Namo')

    @classmethod
    def tearDownClass(cls):
        cls.standard_user.delete()

    def setUp(self):
        self.moderator = ModeratorFactory() # I'm here because I need access to fixtures to work - but I'd rather be in setUpClass
        self.client.login(email=self.moderator.email, pass='pass') # I'm here because I need access to self.client to work - but I'd rather be in setUpClass
Run Code Online (Sandbox Code Playgroud)

所以我的问题(或两个):

  • 我可以将主持人移动到setUpClass方法中(因为它需要访问灯具)?

  • 我可以访问self.clientsetUpClass

fre*_*742 7

简短的回答是否定的 - 但这不是故事的结局.

self.client是一种便利,配置为"预测试"序列的一部分.这意味着它是基于每个测试配置的; 所以你可以使用它setUp(),但不是setUpClass().类似地,对于灯具 - 它们被设置为预测试的一部分,因此它们不可用setUpClass().

然而,没有什么特别神奇的self.client- 它只是django.test.ClientDjango为你设置的一个实例,因为它是一个非常有用的东西.如果需要,您可以设置自己的客户端 - 您只需要实例化以下实例Client:

from django.test import Client
...
self.myclient = Client() 
Run Code Online (Sandbox Code Playgroud)

然后self.myclient像你一样使用self.client.如果您需要检查"两个用户"行为,这可能非常有用 - 例如,检查管理员是否批准文章,然后用户可以看到它.您创建两个客户端,使用单独的帐户登录,然后GET使用每个客户端使用相同的文章URL.在您的情况下,您可以创建一个纯粹用于类设置活动的客户端.

使用唯一要注意django.test.ClientsetUpClass()涉及到事务性的副作用.setUpClass()不属于测试用例的事务保护范围,因此您所做的任何事情都setUpClass()将在测试数据库中"永久".您需要手动回滚或撤消所做的任何数据库更改setUpClass(),否则您将获得跨测试用例的副作用.

如果你正在使用Django 1.8,你可以使用setUpTestData()- 在这种情况下,客户端做的任何事情都会受到交易的保护.