2011-09-21 2 views
7

私はテスト(Django TestCase)からいくつかのセッション変数を読みたいと思っていますDjangoでTestCaseのセッションを使用するには?

どうすればいいですか?

def test_add_docs(self): 
    """ 
    Test add docs 
    """ 
    # I would access to the session here: 
    self.request.session['documents_to_share_ids'] = [1] 

    response = self.client.get(reverse(self.document_add_view_id, args=[1]), follow=True) 
    self.assertEquals(response.status_code, 200) 
+0

...?いくつかの例を挙げてください。 –

答えて

11

残念ながら、これは現時点では希望しないほど簡単ではありません。ご存知のように、適切なセッションクッキーを使ってセッションを設定した他のビューを呼び出していない場合は、self.client.sessionを直接使用するだけでは機能しません。セッションストア/クッキーは、手動で、または他のビューを介して設定する必要があります。

テストクライアントでモックセッションやすくするために、オープンチケットがあります:https://code.djangoproject.com/ticket/10899

がチケットでの回避策に加えて、あなたはdjango.contrib.authを使用している場合に使用することができますトリックがあるが。テストクライアントlogin()メソッドは、テストの後半で使用できるセッションストア/クッキーを設定します。

セッションを設定する他のビューがある場合は、それらをリクエストするとトリックも実行されます(セッションを設定する別のビューが存在する可能性があります。そうでなければ、セッションを読み込むビューはほとんど使用できなくなります)。

from django.test import TestCase 
from django.contrib.auth.models import User 

class YourTest(TestCase): 
    def test_add_docs(self): 
     # If you already have another user, you might want to use it instead 
     User.objects.create_superuser('admin', '[email protected]', 'admin') 

     # self.client.login sets up self.client.session to be usable 
     self.client.login(username='admin', password='admin') 

     session = self.client.session 
     session['documents_to_share_ids'] = [1] 
     session.save() 

     response = self.client.get('/') # request.session['documents_to_share_ids'] will be available 
+4

誰にでもメモ:self.client.sessionは変数に割り当てなければなりません。 –

+0

https://code.djangoproject.com/ticket/10899が閉じられていることに注意してください( "wontfix")。 – Derek

0

あなたはClientのセッションはそのsessionプロパティを介してvarialesアクセスできるようにする必要があり、私はあなたが探しているものでなければなりませんself.client.session['documents_to_share_ids'] = [1]を推測します!

8

Django 1.7以降では、これはずっと簡単です。セッションを直接参照するのではなく、変数として設定してください。

def test_something(self): 
    session = self.client.session 
    session['somekey'] = 'test' 
    session.save() 

andreaspelmeの回避策は、古いバージョンのdjangoでのみ必要です。あなたはそれを直接操作するためのテストで要求のセッションを初期化する必要がある場合はdocs

0

を参照してください:

from django.contrib.sessions.middleware import SessionMiddleware 
from django.http import HttpRequest 


request = HttpRequest() 

middleware = SessionMiddleware() 
middleware.process_request(request) 

request.session.save()