簡體   English   中英

在setUpClass中訪問Django測試客戶端

[英]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.clientsetUpClass

簡短的回答是否定的 - 但這不是故事的結局。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM