How do I modify the session in the Django test framework

风流意气都作罢 提交于 2019-11-28 19:12:09

This is how I did it (inspired by a solution in 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

After that, you may create your tests as:

class BlahTestCase(SessionTestCase):

    def test_blah_with_session(self):
        session = self.session
        session['operator'] = 'Jimmy'
        session.save()

etc...

luc

The client object of the django testing framework makes possible to touch the session. Look at http://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.client.Client.session for details

Be careful : 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)

I think something like this below should work

s = self.client.session
s.update({
    "expire_date": '2010-12-05',
    "session_key": 'my_session_key',
})
s.save()
response = self.client.get('/myview/')
tymm

As Andrew Austin already mentioned, it doesn't work because of this bug: https://code.djangoproject.com/ticket/11475

What you can do though is this:

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

After creating and logging in a user with User.objects.create_user() and self.client.login(), as in the code above, sessions should work.

You can create a custom view which inserts dummy data such as the session.

The view with the corresponding url: /dummy/:

def dummy(request):
    # dummy init data
    request.session['expiry_date'] = '2010-12-05'
    return HttpResponse('Dummy data has been set successfully')

Than in test script just call self.client.get('/dummy/')

I also use this dummy view to initilize the dummy data in the session when testing by hand.

as per the docs you can add values to the session in the test client via eg

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

This will let you test views that require data in the session to function correctly.

So for this question:

session = self.client.session
   session['expire_date'] = '2010-12-05'
   .....
   session.save()

You can modify the session with a middleware.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!