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