2015-06-09 3 views
1

Вот две строки кода я пытаюсь охватить с тестами:Django входа тесты сессии проблемы

from django.contrib.auth import login 
from django.views.generic.edit import FormView 

from accounts.forms import UsernameLoginForm 


class LoginView(FormView): 
    form_class = UsernameLoginForm 
    success_url = '/' 
    template_name = 'login.html' 

    def form_valid(self, form): 
     login(self.request, form.get_user()) 
     return super(LoginView, self).form_valid(form) 

Это кажется правильным способом функционально реализовать форму входа простиралась от django.contrib. auth.forms.AuthenticationForm, но мне пришлось выкопать код из самого входа в систему администратора, чтобы он нуждался в достойном тестировании.

У меня возникли проблемы с получением тестовой среды для установки пользователя на сеанс. RequestFactory не имеет поддержки сеанса, так это то, что я пробовал:

from django.contrib.auth.models import User 
from django.test import TestCase 
from django.test.client import RequestFactory 
import mox 

from accounts.forms import UsernameLoginForm 
from accounts.views import LoginView 


class ViewTests(TestCase): 

    def test_login(self): 
     user = User.objects.create(username='userfoo') 
     view = LoginView() 
#  request = RequestFactory() 
     view.request = self.client 

     self.moxx = mox.Mox() 
     form = self.moxx.CreateMock(UsernameLoginForm) 
     form.get_user().AndReturn(user) 

     self.moxx.ReplayAll() 
     view.form_valid(form) 
     self.moxx.VerifyAll() 

     self.assertTrue(request.user) 

И это ошибка, которая вызывает:

File "/home/renoc/.virtualenvs/alc/local/lib/python2.7/site-packages/django/contrib/auth/__init__.py", line 110, in login 
    request.session.cycle_key() 
    File "/home/renoc/.virtualenvs/alc/local/lib/python2.7/site-packages/django/contrib/sessions/backends/base.py", line 283, in cycle_key 
    data = self._session_cache 
AttributeError: 'SessionStore' object has no attribute '_session_cache' 

self.client.request.session изменчива, и если я пытаюсь установить атрибут на нем не вызывает ошибок, но при этом не имеет атрибута.

ответ

0

После много работы я обнаружил, что могу присоединить сеанс, сгенерированный TestCase.client, к RequestFactory и иметь экземпляр, который я мог бы изменить. Вот что я придумал, чтобы мои тесты работали.

from django.contrib.auth.models import User 
from django.test import TestCase 
from django.test.client import RequestFactory 
import mox 

from accounts.forms import UsernameLoginForm 
from accounts.views import LoginView 


class ViewTests(TestCase): 

    def setUp(self): 
     self.moxx = mox.Mox() 

    def tearDown(self): 
     self.moxx.UnsetStubs() 

    def test_login(self): 
     user = User.objects.create(username='userfoo') 
     user.backend = '' 
     view = LoginView() 
     request = RequestFactory() 
     request.META = {} 
     request.user = None 
     request.session = self.client.session 
     request.session.create() 
     view.request = request 

     form = self.moxx.CreateMock(UsernameLoginForm) 
     form.get_user().AndReturn(user) 

     self.moxx.ReplayAll() 
     view.form_valid(form) 
     self.moxx.VerifyAll() 

     self.assertTrue(request.user) 

Надеюсь, вы по-прежнему будете предлагать предложения, в том числе, почему я не должен делать что-то подобное в первую очередь.

Смежные вопросы