【问题标题】:Accessing Django test client in setUpClass在 setUpClass 中访问 Django 测试客户端
【发布时间】:2015-01-22 09:01:04
【问题描述】:

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

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 吗?

【问题讨论】:

    标签: python django testing


    【解决方案1】:

    简短的回答是否定的 - 但这不是故事的结局。

    self.client 是一种便利,被配置为“预测试”序列的一部分。这意味着它是基于每个测试配置的;所以你可以在setUp() 中使用它,但不能在setUpClass() 中使用。同样对于夹具 - 它们是作为预测试的一部分设置的,因此它们在 setUpClass() 中不可用。

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

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

    然后像使用self.client 一样使用self.myclient。如果您需要检查“两个用户”的行为,这将非常有用 - 例如,检查管理员是否批准了一篇文章,然后用户可以看到它。您创建两个客户端,使用不同的帐户登录,然后GET 与每个客户端相同的文章 URL。在您的情况下,您可以创建一个纯粹用于课程设置活动的客户端。

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

    如果您使用的是 Django 1.8,则可以改用 setUpTestData() - 在这种情况下,客户端所做的任何事情都会受到事务的保护。

    【讨论】:

      【解决方案2】:

      我认为在 Django 1.7 中不可能将版主的创建移到 setUpClass 方法中。

      Django 1.8 有一个 setUpTestData 钩子,您可以使用它。

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

      【讨论】:

      • 查看文档setUpTestData 似乎是一个类方法,所以我想我会遇到同样的问题。
      • 它是一个类方法这一事实应该不是问题。我已经修复了上面的示例,使其成为类方法。
      • 这似乎是正确的,虽然我还没有运行 1.8,所以我不会标记它是正确的......但是:P 仅供参考:使用 setUpClass 方法不能按预期工作 - 它实际上运行每个测试一次。见:groups.google.com/forum/#!topic/django-developers/N0HEAD1ht8k
      • 我不认为你链接的线程说它setUpClass 每次测试运行一次,它说setUpClass 中的更改不会在测试用例类之间回滚。这种行为在 Django 1.8 中由 ticket 20392 修复,与添加 setUpTestData 方法的票证相同。
      猜你喜欢
      • 2011-12-14
      • 1970-01-01
      • 2016-06-10
      • 2012-09-28
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2016-04-05
      • 1970-01-01
      相关资源
      最近更新 更多