2013-02-05 59 views
6

我正在編寫一個登錄視圖,並希望爲該視圖添加一個單元測試。我的看法是這樣的:在Django單元測試中使用會話對象

def login(request): 

    if request.POST: 
      usrname = request.POST.get('username') 
      password = request.POST.get('password') 
      user = authenticate(username=usrname, password=password) 

      if user is not None: 
        auth_login(request, user) 
        return redirect('/core/home/') 
      else: 
        context = {'error_message': "Invalid username or password"} 
        return render(request, 'core/login.html', context) 
    else: 
      c = {} 
      c.update(csrf(request)) 
      return render_to_response('core/login.html',c) 

def home(request): 
    if request.user.is_authenticated(): 
     context = {'user' : request.user} 
     return render(request, 'core/home.html', context) 
    else: 
     return render(request, 'core/login.html') 

而且我的單元測試是這樣的:

class CoreViewTests(TestCase): 
    def setUp(self): 
      self.factory = RequestFactory() 

    def test_login_view_with_valid_user(self): 
      uf = UserFactory() 
      user = uf.make_user("ValidUser1", "12345", "[email protected]") 
      self.assertEqual(user.username, "ValidUser1") 
      request = self.factory.post('/core/login', {"username": "ValidUser1", "password": "12345"}) 
      response = login(request) 
      self.assertEqual(response.status_code, 200) 

單元測試崩潰,因爲他們無法找到會話對象。我通過定義一個虛擬會話字典來關注網站上的一對夫婦教程,但它無濟於事。

任何人都可以告訴我一些如何爲需要處理會話對象的視圖編寫單元測試嗎?

謝謝。

+0

這是您的確切代碼?你在這一行有一個未封閉的字典'request = self.factory.post('/ core/login',{「username」:「ValidUser1」,「password」:「12345」)' - 它應該是'request = self .factory.post('/ core/login',{「username」:「ValidUser1」,「password」:「12345」,})' –

+0

是的,我從代碼複製我的代碼。當我辦理登機手續時,可能是我有一個錯字。 –

+0

那麼,你是否仍然得到糾正錯誤的錯誤? –

回答

7

從爲RequestFactory對象的文檔:

它不支持的中間件。如果視圖正確運行,會話和認證屬性必須由測試本身提供。

如您所說,您可以嘗試手動將request.session設置爲帶有適當內容的字典。不過,它可能會更容易使用舊式的Django test client

+0

使用[mock](https://pypi.python.org/pypi/mock)庫。 –