2010-12-15 2 views
20

장고 테스트 프레임 워크에서 세션을 수정하려면 어떻게나는 내 사이트가 개인이 현재 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/') 

을하지만 오류 얻을 :

요청을 받기 전에 클라이언트 세션을 수정하는 방법에 대한 생각? 나는 this을 보았고 작동하지 않는 것 같습니다.

+0

'session'는'dict' 같은 개체입니다, 당신이 당신의 도움을들 [X]'얻을 수있는'과 설정 값 – xj9

답변

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 serializer를 사용하여 django 1.6에서 여전히 작동합니까 (SESSION_SERIALIZER에 대한 표준 JSONSerializer 대신) –

0

middleware으로 세션을 수정할 수 있습니다.

33

django 테스트 프레임 워크의 클라이언트 객체는 세션을 만질 수 있습니다. 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 : 'dict'객체에 'save'속성이 없습니다. 이 오류는 client.session 객체가 사전이기 때문에 발생합니다. client.session은 요청이 이루어진 후에 (그리고 사용자가 로그인 한 경우에만) 진정한 Session 객체가되는 것 같습니다. 다른 제안? 당신은 (쉘에서)를 입력하여이 작업을 반복 할 수 있습니다 : 를 django.test 수입 클라이언트 클라이언트에서 = 클라이언트() S = client.session 의 [ 'EXPIRE_DATE'] = '2010-12-05' 의 [ 'session_key'] = 'my_session_key' s.save() – Riley

+5

luc의 제안은 작동하지만 django 버그는 https://code.djangoproject.com/ticket/11475 –

+0

에 1을 더한 것 같습니다. –

3

당신은 같은 세션으로 더미 데이터를 삽입하는 사용자 지정보기를 만들 수 있습니다 일을해야한다고 생각 : 자세한 내용

주의에 대한 http://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.client.Client.session 봐.

해당 URL로보기 :/더미/:

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

이 나는 ​​또한에 의해 테스트 할 때 세션에 더미 데이터를 initilize이 더미보기를 사용하여 전화 손.

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()을 사용하여 사용자를 만들고 로그인 한 후에 세션이 작동해야합니다.당신이

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

예를 들어

를 통해 테스트 클라이언트에서 세션에 값을 추가 할 수있는 문서에 따라

0

이것은 당신이 제대로 작동하려면 세션에서 데이터를 필요로 뷰를 테스트하게됩니다. 그래서이 질문에 대한

:

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