2011-05-30 20 views
1

我正努力想出這個問題,會話正常運行時,我正常運行我的應用程序,但我無法弄清楚如何在測試用例中設置會話中的數據。如何在django測試用例中設置cookie?

文檔在測試用例中說,您必須保存會話以在提出請求之前應用更改。 https://docs.djangoproject.com/en/1.2/topics/testing/#persistent-state

例如

from django.test import TestCase 

class TestLogin(TestCase): 

    def test_processuser(self): 
     redirect = '/processuser/' 
     session = self.client.session 
     session["id"] = '1234' 
     session.save() 
     response = self.client.get(redirect) 

但self.client.session返回的session對象只是一個普通的python字典嗎?

Diging到代碼中調用Client.session是這樣的:

def _session(self): 
    """ 
    Obtains the current session variables. 
    """ 
    if 'django.contrib.sessions' in settings.INSTALLED_APPS: 
     engine = import_module(settings.SESSION_ENGINE) 
     cookie = self.cookies.get(settings.SESSION_COOKIE_NAME, None) 
     if cookie: 
      return engine.SessionStore(cookie.value) 
    return {} 
session = property(_session) 

cookie = self.cookies.get(settings.SESSION_COOKIE_NAME, None)回報None所以它只是在一個會話存儲代替返回的字典。

看起來我必須在測試客戶端做一些準備工作才能保存會話?沒有真正有這方面的經驗,任何幫助,將不勝感激。

Django的1.2.5 的Python 2.6.5

乾杯,

阿西姆。

回答

1

最簡單的事情就是以某人身份登錄,因此測試客戶端會爲您設置cookie。

self.client.login(username,password) 

應該做的。請參閱documentation瞭解更多信息。

+0

由於該訣竅.. 。 – jawache 2011-05-30 18:49:03

6

爲真正需要設置cookie的人添加此項。因爲他們需要做一些Django認證機制未涉及的內容...

您不能直接在TestClient對象上設置cookie,但如果您使用RequestFactory類,則可以這樣做。因此,而不是(說):

response = Client().post('/foo') 

你這樣做:

request = RequestFactory().post('/foo') 
request.COOKIES['blah'] = 'hello' 
response = foo_view(request) 

其中foo_view是對應於「/富」路徑的觀點,即你正在尋找測試視圖。

HTH有人。

0

對於其他遇到此問題的人請注意,Client.logout()函數將丟棄您的Cookie。例如:

response = self.client.post(self.url, self.data) 
print response.client.cookies.items() # Displays the cookie you just set 

self.client.logout() 

response = self.client.post(reverse('loginpage'), {'username': 'username', 'password': 'password'}, follow=True) 
print response.client.cookies.items() # Does not display the cookie you set before since it got destroyed by logout() 

要確保你的cookies測試期間活着對您的註銷頁面來電使用Client.logout()功能,像這樣的代替:

response = self.client.post(self.url, self.data) 
print response.client.cookies.items() # Displays the cookie you just set 

self.client.get(reverse('logoutpage')) 

response = self.client.post(reverse('loginpage'), {'username': 'username', 'password': 'password'}, follow=True) 
print response.client.cookies.items() # Does display the cookie you set before since it did not get destroyed by client.logout() 
相關問題