【问题标题】:Django Unittesting adding a variable to the sessionDjango Unittesting 向会话添加变量
【发布时间】:2011-09-30 16:24:12
【问题描述】:

在我的单元测试中,我需要向会话中添加一个变量,因为该变量用于正在测试的视图中。 django 文档说这可以通过以下方式(https://docs.djangoproject.com/en/1.3/topics/testing/#django.test.client.Client.session):

def test_something(self):
    session = self.client.session
    session['somekey'] = 'test'
    session.save()

这个代码示例实际上是行不通的,因为你会得到一个dict没有save函数的错误。我还尝试了各种其他方法来更改会话字典中的内容,但还没有找到更改它的方法。 我知道这意味着什么,我得到的是一个 dict 对象,所以它没有保存功能。但是会话字典在添加键时也不会更新。

使用 self.client.session 时的文档状态应该返回一个 SessionStore 对象而不是字典。

【问题讨论】:

  • 你使用的是unittest还是django.utils.unittest
  • 为什么需要保存?您在哪里查看其他地方的会话?
  • 就像一个疯狂的猜测,尝试删除session.save() 行,看看它是否有效。我对 django.test.client.Client 源代码的阅读表明,会话属性只是直接从引擎中取出的会话对象。它应该由 Session 中间件自动保存。
  • 我试过了,这也是我调试后的想法,发现它只是一个字典。会再试一次,也许我做得不对。
  • @Elf Sternberg:不行,再试一次。 self.client.session['user_id'] = self.user.id

标签: python django unit-testing session


【解决方案1】:

现在似乎 Django 中存在一个错误,因此未经身份验证的用户无法更改会话。这是对应的票:https://code.djangoproject.com/ticket/11475

一种解决方法是创建一个虚拟视图,在其中设置会话变量并使用 Client.get('url_of_dummy_view') 调用该视图。

【讨论】:

    【解决方案2】:

    @Sam Stoelinga 引用的票证已作为副本关闭。对应的票可以在here找到。

    要保存会话数据,您必须使用经过身份验证的用户。我找到了解决方案here

    class BlogAdminTestCase(TestCase):
        def setUp(self):
            # Setup Test User
            User.objects.create_user(
                username='foo',
                password='bar'
            )
    
            # Must login to modify session variables
            self.client.login(username='foo', password='bar')
    
            s = self.client.session
            s['my_session_variable'] = 'Yay!'
            s.save()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2012-10-23
      • 2010-09-29
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多