我的网站允许个人在没有登录的情况下通过基于当前session_key创建用户来提供内容
我想为我的视图设置测试,但似乎无法修改request.session:
我想这样做:
from django.contrib.sessions.models import Session
s = Session()
s.expire_date = '2010-12-05'
s.session_key = 'my_session_key'
s.save()
self.client.session = s
response = self.client.get('/myview/')
但我收到错误:
AttributeError: can't set attribute
关于如何在发出请求之前修改客户端会话的想法? 我看过this但它似乎无法正常工作
答案 0 :(得分:46)
django测试框架的客户端对象可以触摸会话。请查看http://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.client.Client.session了解详情
小心:To modify the session and then save it, it must be stored in a variable first (because a new SessionStore is created every time this property is accessed)
我认为下面的内容应该有效
s = self.client.session
s.update({
"expire_date": '2010-12-05',
"session_key": 'my_session_key',
})
s.save()
response = self.client.get('/myview/')
答案 1 :(得分:32)
这就是我的做法(受到http://blog.mediaonfire.com/?p=36中的解决方案的启发。)
from django.test import TestCase
from django.conf import settings
from django.utils.importlib import import_module
class SessionTestCase(TestCase):
def setUp(self):
# http://code.djangoproject.com/ticket/10899
settings.SESSION_ENGINE = 'django.contrib.sessions.backends.file'
engine = import_module(settings.SESSION_ENGINE)
store = engine.SessionStore()
store.save()
self.session = store
self.client.cookies[settings.SESSION_COOKIE_NAME] = store.session_key
之后,您可以将测试创建为:
class BlahTestCase(SessionTestCase):
def test_blah_with_session(self):
session = self.session
session['operator'] = 'Jimmy'
session.save()
等...
答案 2 :(得分:11)
正如安德鲁·奥斯汀已经提到的那样,由于这个错误,它无法正常工作:https://code.djangoproject.com/ticket/11475
你可以做的是:
from django.test import TestCase
from django.test.client import Client
from django.contrib.auth.models import User
class SessionTestCase(TestCase):
def setUp(self):
self.client = Client()
User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
self.client.login(username='john', password='johnpassword')
def test_something_with_sessions(self):
session = self.client.session
session['key'] = 'value'
session.save()
使用User.objects.create_user()和self.client.login()创建并登录用户后,如上面的代码所示,会话应该有效。
答案 3 :(得分:3)
您可以创建一个插入虚拟数据的自定义视图,例如会话。
带有相应网址的视图:/ dummy /:
def dummy(request):
# dummy init data
request.session['expiry_date'] = '2010-12-05'
return HttpResponse('Dummy data has been set successfully')
比在测试脚本中调用self.client.get('/dummy/')
我还使用这个虚拟视图在手动测试时初始化会话中的虚拟数据。
答案 4 :(得分:1)
根据文档,您可以通过例如
向测试客户端中的会话添加值def test_something(self):
session = self.client.session
session['somekey'] = 'test'
session.save()
https://docs.djangoproject.com/en/dev/topics/testing/tools/#django.test.Client.session
这将允许您测试需要会话中的数据才能正常运行的视图。
所以对于这个问题:
session = self.client.session
session['expire_date'] = '2010-12-05'
.....
session.save()
答案 5 :(得分:0)
您可以使用middleware修改会话。