Django单元测试如何向会话添加变量
在我的单元测试中,我需要往会话里添加一个变量,因为这个变量在我正在测试的视图中会用到。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('虚拟视图的链接')来调用这个视图。