开发者

How do I modify the session in the Django test framework

开发者 https://www.devze.com 2023-01-31 06:56 出处:网络
My site allows individuals to contribute content in the absence of being logged in by creating a User based on the current session_key

My site allows individuals to contribute content in the absence of being logged in by creating a User based on the current session_key

I would like to setup a test for my view, but it seems that it is not possible to modify the request.session:

I'd like to do this:

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/')

But I get the error:

AttributeError: can't set attribute

Thoughts on how to modify the client se开发者_如何学Pythonssion before making get requests? I have seen this and it doesn't seem to work


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/')


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...


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

精彩评论

暂无评论...
验证码 换一张
取 消