34

私のサイトでは、現在の 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/')

しかし、私はエラーが発生します:

AttributeError: can't set attribute

get リクエストを行う前にクライアント セッションを変更する方法について考えていますか? 私はこれを見ましたが、うまくいかないようです

4

5 に答える 5

66

django テスト フレームワークの client オブジェクトを使用すると、セッションにアクセスできます。詳細については、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/')
于 2010-12-15T20:42:47.607 に答える
38

これが私が行った方法です(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()

等...

于 2011-10-11T07:08:13.687 に答える
14

Andrew Austin が既に述べたように、このバグのために機能しません: 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', '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()

上記のコードのように、User.objects.create_user() と self.client.login() でユーザーを作成してログインすると、セッションが機能するはずです。

于 2013-03-04T03:55:39.873 に答える
3

セッションなどのダミーデータを挿入するカスタムビューを作成できます。

対応するURLのビュー:/ dummy /:

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

また、このダミービューを使用して、手動でテストするときにセッション内のダミーデータを初期化します。

于 2011-04-16T13:51:05.317 に答える
2

ドキュメントに従って、たとえばテストクライアントのセッションに値を追加できます

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()
于 2017-12-07T19:14:06.377 に答える