Django单元测试如何向会话添加变量

2 投票
2 回答
1161 浏览
提问于 2025-04-16 21:02

在我的单元测试中,我需要往会话里添加一个变量,因为这个变量在我正在测试的视图中会用到。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()

不过,这段代码实际上是行不通的,因为你会遇到一个错误,提示字典没有保存的功能。我还尝试了其他几种方法来修改会话字典里的内容,但到现在为止还没找到合适的方法。我知道这是什么意思,我得到的是一个字典对象,所以它没有保存的功能。而且,当我添加键的时候,会话字典也没有更新。

文档中提到,当使用self.client.session时,它应该返回一个SessionStore对象,而不是一个字典。

2 个回答

0

@Sam Stoelinga提到的那个问题已经被关闭了,因为它和另一个问题是重复的。你可以在这里找到相关的问题。

要保存会话数据,你需要使用一个已经登录的用户。我在这里找到了一个解决方案。

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()
0

现在看起来Django有个bug,所以未登录的用户无法更改会话。这是相关的报告链接:https://code.djangoproject.com/ticket/11475

一个解决方法是创建一个虚拟的视图,在这个视图里设置会话变量,然后用Client.get('虚拟视图的链接')来调用这个视图。

撰写回答