2010-09-01 18 views
6

我有一個看起來像這樣的觀點:如何在重定向後測試Django中的上下文和會話?

def login(request): 
    ... 
    # some variables has been set here 
    ... 
    if request.POST.get('remember_me', None): 
     request.session.set_expiry(1209600) # 2 weeks 
    return HttpResponseRedirect(reverse('dashboard')) 

現在如果我斷言使用上下文變量,我得到的錯誤:「AttributeError的:‘HttpResponseRedirect’對象有沒有屬性‘背景’」這是同樣的會議。我如何測試它,然後設置了一些變量,並且即使我重定向,可能的會話過期也已設置?

回答

5

您無法從HttpResponseRedirect檢索上下文變量。如果你正在重定向,爲什麼你要設置上下文變量沒有意義。

重定向後,您當然應該能夠從會話中獲取變量。我已經在我的幾個測試用例中完成了這項工作。你如何在你的測試用例中聲明會話數據?

這是我如何去重定向後斷言會話變量:

response = self.client.post(reverse('foo')) 
self.assertRedirects(response, reverse('bar', args = ['baz']), 
     status_code = 302, target_status_code = 200) 
self.assertEqual('value', self.client.session.get('key')) 

Self.client在這種情況下的django.test.client.Client實例。

更新

(響應於@Marconi的評論)下面是重定向之後顯示一個消息給用戶的一種方法。這幾乎是從我的answer逐字複製到另一個question

您的第一個視圖可以爲當前使用的身份驗證創建消息,並讓第二個視圖讀取並刪除它。類似這樣的:

def first_view(request, *args, **kwargs): 
    # all goes well 
    message = _("<message for user>") 
    request.user.message_set.create(message = message) 
    return redirect('second_view') 

def second_view(request, *args, **kwargs): 
    # Render page 

# Template for second_view: 
{% for message in messages %} 
    ... 
{% endfor %} 

消息被保存到數據庫。這意味着你可以在重定向之後訪問它們。在渲染模板時會自動讀取和刪除它們。你將不得不使用RequestContext這個工作。

+0

我一直在尋找即使在重定向測試方面的原因是,我使用django_notify應用,只是重定向之前,我喜歡設置一些消息: request.notifications.error(_(U「這是不是你的電子郵件或密碼不正確「)) 然後重定向回登錄表單,以便表單不會保留先前輸入的值,並且刷新也不會重新提交表單。我可以訪問通知,如果沒有重定向使用: response.context ['notifications'] 但上面的錯誤顯示出來時,有一個重定向,我只是想確保顯示的消息。或者你有更好的方法嗎? – Marconi 2010-09-01 17:32:54

+0

@Marconi:我已經更新了我的答案。往上看。 – 2010-09-02 08:24:31

1

我所做的(爲專門檢查會話),是不使用Django的測試客戶端,並創建自己的模擬請求對象,並將其直接傳遞給我的看法,像這樣:

def test_method(self): 
    class request(object): 
     POST = {'dummy':'data'} 
     class session: 
      @staticmethod 
      def set_expiry(nmbr): 
       request.session.nmbr = nmbr 

    views.login(request) 
    self.assertEqual(request.session.nmbr, 1209600) 

另一個選項可能在使用Django的測試客戶端時使用「follow = True」參數。