2010-12-15 76 views
20

我的網站允許個人在沒有通過基於當前session_key可以創建一個用戶被記錄在貢獻內容的會議如何修改Django的測試框架

我想建立一個測試我的查看,但它似乎是不可能修改的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

'session'是'dict'狀物體,你應該使用'S [X]'來獲取和設置值 – xj9 2014-10-03 18:57:33

回答

28

這就是我的做法(靈感來自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() 

等等

+0

這是否仍然適用於使用Pickle序列化器的django 1.6(而不是現在用於SESSION_SERIALIZER的標準JSONSerializer) – 2013-12-12 17:08:35

33

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

呂克您好,感謝您的幫助,但這不起作用。我收到以下錯誤: AttributeError:'字典'對象沒有'保存'屬性 這是因爲client.session對象是字典。看來client.session只有在請求發出後才成爲一個真正的Session對象(並且只有當用戶登錄時)。還有其他建議嗎? 可以通過輸入(來自殼)重複此:從django.test進口客戶 客戶 =客戶端() S = client.session S [ 'EXPIRE_DATE'] = '2010-12-05' 小號['session_key'] ='my_session_key' s.save() – Riley 2010-12-20 15:24:55

+5

它看起來像luc建議應該工作,但它的django錯誤:https://code.djangoproject.com/ticket/11475 – 2012-06-15 20:25:39

+0

加1再次.. – 2013-03-04 21:53:30

3

您可以創建一個插入虛擬數據,如會話的自定義視圖。

與相應的網址查看:/虛擬/:

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

我也用這個虛擬視圖通過測試時,用來初始化會話虛擬數據手。

10

安德魯·奧斯汀已經提到的,它並沒有因爲這個錯誤的工作: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', '[email protected]', '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()創建並登錄用戶後,如上面的代碼所示,會話應該可以工作。

0

按照該文檔,您可以通過如

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