在setUpClass中访问Django测试客户机

2024-06-06 18:46:50 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

所以我的问题是:

  • 我可以将主持人移到setUpClass方法中吗(根据需要) 进入固定装置)?

  • 我可以访问setUpClass中的self.client


Tags: tonameselfclientheredefneedfixtures
2条回答

简短的回答是不,但这并不是故事的结尾。在

self.client是一种方便,配置为“预测试”序列的一部分。这意味着它是在每个测试的基础上配置的;因此您可以在setUp()中使用它,但不能在setUpClass()中使用它。与fixture类似,它们是作为预测试的一部分设置的,因此它们在setUpClass()中不可用。在

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

from django.test import Client
...
self.myclient = Client() 

然后像使用self.myclient一样使用self.client。如果您需要检查“两个用户”的行为,这将非常有用—例如,检查管理员是否批准了一篇文章,那么用户就可以看到它。创建两个客户机,用单独的帐户登录,然后在每个客户机上GET相同的文章URL。你可以纯粹为你的客户机活动创建一个案例。在

关于在setUpClass()中使用django.test.Client的唯一警告与事务性副作用有关。setUpClass()不属于测试用例的事务保护范围,因此您在setUpClass()中所做的任何操作都将在测试数据库上“永久”。您将需要手动回滚或撤消setUpClass()所做的任何数据库更改,否则您将得到跨测试用例的副作用。在

如果您使用的是django1.8,那么您可以使用setUpTestData(),在这种情况下,客户机所做的任何事情都会受到事务的保护。在

我认为在django1.7中不可能将主持人的创建移动到setUpClass方法中。在

django1.8有一个^{}钩子,您可以使用它。在

class UserModelTest(TestCase):
    ...
    @classmethod
    def setUpTestData(cls):
        cls.moderator = ModeratorFactory()

相关问题 更多 >