我有一个测试类,我想创建并登录用户一次:
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
方法中(根据需要)
获得固定装置)?
我可以访问self.client
中的setUpClass
吗?
答案 0 :(得分:6)
简短的回答是否定的 - 但这不是故事的结局。
self.client
是一种便利,它被配置为" pre-test"的一部分。序列。这意味着它是基于每个测试配置的;因此,您可以在setUp()
中使用它,但不能在setUpClass()
中使用它。类似地,对于灯具 - 它们被设置为预测试的一部分,因此它们在setUpClass()
中不可用。
然而,self.client
没有什么特别神奇的东西 - 它只是Django为你设置的django.test.Client
的一个实例,因为它是非常的东西有用的东西。如果需要,您可以设置自己的客户端 - 您只需要实例化Client
的实例:
from django.test import Client
...
self.myclient = Client()
然后像self.myclient
一样使用self.client
。如果您需要检查"两个用户"这可能非常有用。行为 - 例如,检查管理员是否批准文章,然后用户可以看到它。您创建两个客户端,使用单独的帐户登录,然后GET
与每个客户端相同的文章URL。在您的情况下,您可以创建一个纯粹用于类设置活动的客户端。
在django.test.Client
中使用setUpClass()
的唯一警告与交易副作用有关。 setUpClass()
并不属于测试用例的事务保护范围,因此您在setUpClass()
中执行的任何操作都将永久保留"在测试数据库上。您需要手动回滚或撤消setUpClass()
所做的任何数据库更改,否则您将获得跨测试用例的副作用。
如果您使用的是Django 1.8,则可以使用setUpTestData()
代替 - 在这种情况下,客户端 的所有内容都将受到交易的保护。
答案 1 :(得分:1)
我认为不可能将主持人的创建转移到Django 1.7中的setUpClass
方法。
Django 1.8有一个setUpTestData
钩子,你可以使用它。
class UserModelTest(TestCase):
...
@classmethod
def setUpTestData(cls):
cls.moderator = ModeratorFactory()