![](/img/trans.png)
[英]Django LiveServerTestCase: User created in in setUpClass method not available in test_method?
[英]Accessing Django test client in setUpClass
我有一個測試類,我想創建並登錄用戶一次:
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
?
簡短的回答是否定的 - 但這不是故事的結局。
self.client
是一種便利,被配置為“預測試”序列的一部分。 這意味着它是基於每個測試配置的; 所以你可以在setUp()
使用它,但不能在setUpClass()
使用它。 類似地,對於燈具 - 它們被設置為預測試的一部分,因此它們在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()
所做的任何數據庫更改,否則您將獲得跨測試用例的副作用。
如果您使用的是Django 1.8,則可以使用setUpTestData()
- 在這種情況下,客戶端執行的任何操作都將受到事務的保護。
我不認為可以將主持人的創建移動到Django 1.7中的setUpClass
方法中。
Django 1.8有一個你可以使用的setUpTestData
鈎子。
class UserModelTest(TestCase):
...
@classmethod
def setUpTestData(cls):
cls.moderator = ModeratorFactory()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.