如何在Django中使用TestCase中的会话?

nic*_*las 12 testing django session

我想从测试中读取一些会话变量(Django TestCase)

如何以干净的方式做到这一点?

def test_add_docs(self):
    """
    Test add docs
    """
    # I would access to the session here:
    self.request.session['documents_to_share_ids'] = [1]

    response = self.client.get(reverse(self.document_add_view_id, args=[1]), follow=True)
    self.assertEquals(response.status_code, 200)
Run Code Online (Sandbox Code Playgroud)

Buf*_*fke 18

从Django 1.7+开始,这就容易多了.确保将会话设置为变量,而不是直接引用它.

def test_something(self):
    session = self.client.session
    session['somekey'] = 'test'
    session.save()
Run Code Online (Sandbox Code Playgroud)

andreaspelme的解决方法仅在旧版本的django中需要.查看文档

  • 将会话放入变量的原因是因为每次编写self.client.session时,都会得到[新对象](https://github.com/django/django/blob/2.2/django/test/client .py#L452-L463)。 (2认同)

and*_*lme 17

不幸的是,这并不像你希望的那样容易.您可能已经注意到,self.client.session如果您没有调用已为您设置适当会话cookie的会话的其他视图,则直接使用将无效.然后必须手动设置会话存储/ cookie,或通过其他视图设置.

有一个打开的票证可以更容易地模拟与测试客户端的会话:https://code.djangoproject.com/ticket/10899

除了故障单中的解决方法之外,还有一个技巧可以在您使用时使用django.contrib.auth.测试客户端login()方法设置会话存储/ cookie,以便稍后在测试中使用.

如果您有任何其他设置会话的视图,请求它们也可以做到这一点(您可能有另一个视图设置会话,否则您的视图读取会话将非常不可用).

from django.test import TestCase
from django.contrib.auth.models import User

class YourTest(TestCase):
    def test_add_docs(self):
        # If you already have another user, you might want to use it instead
        User.objects.create_superuser('admin', 'foo@foo.com', 'admin')

        # self.client.login sets up self.client.session to be usable
        self.client.login(username='admin', password='admin')

        session = self.client.session
        session['documents_to_share_ids'] = [1]
        session.save()

        response = self.client.get('/')  # request.session['documents_to_share_ids'] will be available
Run Code Online (Sandbox Code Playgroud)

  • 只是给每个人一个注释:self.client.session必须分配给一个变量. (8认同)

men*_*nov 5

如果您需要在测试中为请求初始化会话以直接操作它:

from django.contrib.sessions.middleware import SessionMiddleware
from django.http import HttpRequest


request = HttpRequest()

middleware = SessionMiddleware()
middleware.process_request(request)

request.session.save()
Run Code Online (Sandbox Code Playgroud)