2010-12-15 25 views
20

Django testi çerçevesinde oturumu değiştirmek nasılBen Sitem bireyler cari session_key dayanan bir kullanıcı oluşturarak oturum açmaktan yokluğunda içeriğe katkıda verir

Ben kurulum test etmek istiyorum benim görüntüleyebilir, ama buna request.session değiştirmek mümkün görünmemektedir:

bunu yapmak istiyorum:

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

ama hatayı alıyorum:

AttributeError: can't set attribute 

İstemci oturumunu istekte bulunmadan önce nasıl değiştireceğinize dair düşünceleriniz var mı? this'u gördük ve

+0

'session' bir' dict' benzeri nesnedir, size yardım için s [x] 'almak için' ve ayarlanan değerleri – xj9

cevap

28

Nasıl yaptım (http://blog.mediaonfire.com/?p=36 numaralı bir çözümden esinlenerek).

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 

Bundan sonra, testlerinizi yaratabilir olarak: vb

class BlahTestCase(SessionTestCase): 

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

...

Andrew Austin zaten bunun nedeni bu hata çalışmıyor belirtildiği gibi
+0

Bu hala, Dodgego 1.6 ile Pickle serializer'ı kullanarak çalışır (şimdi SESSION_SERIALIZER için standart JSONSerializer yerine) –

0

çalışmasını göremiyorum. Oturumunuzu middleware ile değiştirebilirsiniz.

33

Django sınama çerçevesinin istemci nesnesi oturuma dokunmayı mümkün kılar. 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)

Böyle bir şey aşağıda

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

Merhaba Luc sayesinde kullanmalıdır, ama bu işe yaramıyor. Aşağıdaki hatayı alıyorum: AttributeError: 'dict' nesnesinin 'save' özelliği yoktur Bunun nedeni, client.session nesnesinin bir sözlük olmasıdır. Görünüşe göre, client.session yalnızca istek yapıldıktan sonra (ve sadece bir kullanıcı giriş yapmışsa) gerçek bir Oturum nesnesi haline gelir. Başka önerileriniz var mı? için (bir kabuk) girerek bu tekrarlayabilir: django.test içe Müşteri istemciden = Müşteri() s = client.session s [ 'EXPIRE_DATE'] = '2010-12-05' s ['session_key'] = 'my_session_key' s.save() – Riley

+5

Neyin işe yarayacağı önerilmiş gibi görünüyor, ama bir django hatası: https://code.djangoproject.com/ticket/11475 –

+0

artı 1 tekrar .. –

3

Böyle oturum olarak kukla veri ekler özel bir görünüm oluşturabilirsiniz çalışması gerektiğini düşünüyorum: Ayrıntılar

dikkat için http://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.client.Client.session bak.

karşılık gelen url ile görünümü:/kukla /:

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

test komut dosyasındaki Daha sadece self.client.get('/dummy/')

Ben de tarafından test ederken oturumda yapay veriler initilize için bu kukla görünümü kullanmak çağrı el.

10

: https://code.djangoproject.com/ticket/11475

Yapabilecekleriniz:

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

Yukarıdaki kodda olduğu gibi, User.objects.create_user() ve self.client.login() ile bir kullanıcı oluşturup oturum açtıktan sonra oturumlar çalışmalıdır.Eğer

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

ör

yoluyla deney istemci oturumuna değerleri ekleyebilirsiniz docs göre

0

Bu düzgün çalışması için oturumda veri gerektiren görüşlerini test sağlayacak. Yani bu soru için

:

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