相关疑难解决方法(0)

如何在Django测试框架中修改会话

我的网站允许个人在没有登录的情况下通过基于当前session_key创建用户来贡献内容

我想为我的视图设置一个测试,但似乎无法修改request.session:

我想这样做:

from django.contrib.sessions.models import Session
s = Session()
s.expire_date = '2010-12-05'
s.session_key = 'my_session_key'
s.save()
self.client.session = s
response = self.client.get('/myview/')
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

AttributeError: can't set attribute
Run Code Online (Sandbox Code Playgroud)

关于如何在获取请求之前修改客户端会话的想法?我已经看到了这个,它似乎并没有工作

python django django-testing django-sessions

29
推荐指数
3
解决办法
1万
查看次数

Django在测试中测试存储的会话数据

我有这样的观点:

def ProjectInfo(request):
    if request.method == 'POST':
        form = ProjectInfoForm(request.POST)
        if form.is_valid():
            # if form is valid, iterate cleaned form data
            # and save data to session
            for k, v in form.cleaned_data.iteritems():
                request.session[k] = v
            return HttpResponseRedirect('/next/')
        else:
            ...
    else:
        ...
Run Code Online (Sandbox Code Playgroud)

在我的测试中:

from django.test import TestCase, Client
from django.core.urlresolvers import reverse
from tool.models import Module, Model
from django.contrib.sessions.models import Session

def test_project_info_form_post_submission(self):
    """
    Test if project info form can be submitted via post.
    """
    # set up our POST data …
Run Code Online (Sandbox Code Playgroud)

django django-testing

15
推荐指数
1
解决办法
8782
查看次数

在django测试中设置会话变量

这有效

def test_access_to_home_with_location(self):
    self.client.login(username=self.user.get_username(), password='pass')
    session = self.client.session
    session['location'] = [42]
    session.save()
    response = self.client.get(reverse('home'))
Run Code Online (Sandbox Code Playgroud)

但是这个

def test_access_to_home_with_location(self):
    session = self.client.session
    session['location'] = [42]
    session.save()
    response = self.client.get(reverse('home'))
Run Code Online (Sandbox Code Playgroud)

打破

====================================================================== 
ERROR: test_access_to_home_with_location (posts.tests.HomeViewTestCase)       
----------------------------------------------------------------------      
Traceback (most recent call last):                                            
  File "tests.py", line 32, in test_access_to_home_with_location                            
    session.save()                                                              
AttributeError: 'dict' object has no attribute 'save'
Run Code Online (Sandbox Code Playgroud)

所以似乎没有调用self.client.login() self.client.session只是一个空字典.有没有办法将其初始化为会话对象?

django django-testing

11
推荐指数
2
解决办法
4859
查看次数

在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')
Run Code Online (Sandbox Code Playgroud)

我的单元测试看起来像这样:

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", "user@abc.com")
            self.assertEqual(user.username, "ValidUser1") …
Run Code Online (Sandbox Code Playgroud)

django session

7
推荐指数
1
解决办法
4386
查看次数