2011-04-25 45 views
28

我是Django的新手,我想單元測試需要用戶登錄的視圖(@login_requred)。 Django的好心提供了RequestFactory,我可以用理論上直接調用視圖:測試Django需要使用RequestFactory登錄的視圖

factory = RequestFactory() 
request = factory.get("/my/home/url") 
response = views.home(request) 

然而,調用失敗

AttributeError: 'WSGIRequest' object has no attribute 'session' 

顯然,this is intentional,但是,這會讓我嗎?我如何測試需要身份驗證的視圖(在我的情況下是所有視圖)?或者我完全採用錯誤的方法?

我正在使用Django 1.3和Python 2.7。

+0

我想Django測試客戶端http://docs.djangoproject.com/en/dev/topics/testing/,應該是你正在尋找的。 – dm03514 2011-04-25 13:15:41

回答

46

使用RequestFactory時,您正在測試具有完全已知輸入的視圖。

允許將測試與各種安裝的中間件組件執行的附加處理的影響隔離開來,從而更精確地進行測試。

可以與查看功能的附加數據建立請求期望,即:

request.user = AnonymousUser() 
    request.session = {} 

我個人的建議是使用TestClient的做集成測試(即:在店整個用戶結帳過程,包括許多步驟)和RequestFactory來測試獨立的視圖函數行爲及其輸出(即將產品添加到購物車)。

+0

AttributeError:'dict'對象沒有'flush'屬性Django 1.11' – 2017-10-16 11:59:57

14

正如@bmihelac所提到的,RequestFactory只測試已知輸入(這意味着沒有包含中間件)。有關推理的詳細信息,請閱讀here。如果您需要空白會話,則接受的解決方案非常棒(我同意@dm03514客戶端應該用於集成測試)。

然而,如果你仍然想使用Django的SessionMiddleware(或任何中間件),你可以做這樣的事情在你的測試(下面的例子是用於測試基於類的視圖):

from django.contrib.sessions.middleware import SessionMiddleware 
from django.test import TestCase, RequestFactory 
from someapp.views import SomeView # a Class Based View 


class SomePageTest(TestCase): 

    def setUp(self): 
     self.factory = RequestFactory() 

    def test_some_page_requires_session_middleware(self): 
     # Setup 
     request = self.factory.get('somepage.html') 
     middleware = SessionMiddleware() 
     middleware.process_request(request) 
     request.session.save() 

     response = SomeView.as_view()(request) 

     self.assertEqual(response.status_code, 200)