如何在django测试用例中设置cookie?

时间:2011-05-30 08:06:10

标签: python django

我正在努力解决这个问题,当我正常运行我的应用程序时会话工作但我无法弄清楚如何在我的测试用例中在会话中设置数据。

文档说在测试用例中,您必须保存会话以在发出请求之前应用更改。 https://docs.djangoproject.com/en/1.2/topics/testing/#persistent-state

e.g。

from django.test import TestCase

class TestLogin(TestCase):

    def test_processuser(self):
        redirect = '/processuser/'
        session = self.client.session
        session["id"] = '1234'
        session.save()
        response = self.client.get(redirect)

然而,从self.client.session返回的会话对象只是一个普通的python dict?

深入了解Client.session调用的代码:

def _session(self):
    """
    Obtains the current session variables.
    """
    if 'django.contrib.sessions' in settings.INSTALLED_APPS:
        engine = import_module(settings.SESSION_ENGINE)
        cookie = self.cookies.get(settings.SESSION_COOKIE_NAME, None)
        if cookie:
            return engine.SessionStore(cookie.value)
    return {}
session = property(_session)

cookie = self.cookies.get(settings.SESSION_COOKIE_NAME, None)返回None所以它只返回一个dict而不是会话存储。

在保存会话之前,我似乎必须在测试客户端做更多的准备工作?在这方面没有太多的经验,任何帮助都将不胜感激。

Django 1.2.5 Python 2.6.5

干杯,

阿西。

4 个答案:

答案 0 :(得分:7)

为真正执行的人添加此功能需要设置Cookie,例如因为他们需要做一些Django auth机制未涵盖的事情......

您无法直接在TestClient个对象上设置Cookie,但如果使用RequestFactory类,则可以执行此操作。而不是(说):

response = Client().post('/foo')
你这样做:

request = RequestFactory().post('/foo')
request.COOKIES['blah'] = 'hello'
response = foo_view(request)

其中foo_view是与'/ foo'路径对应的视图,即您要测试的视图。

HTH某人。

答案 1 :(得分:1)

最简单的事情是以某人身份登录,因此测试客户端会为您设置cookie。

self.client.login(username,password)

应该这样做。有关详情,请参阅documentation

答案 2 :(得分:0)

对于遇到此问题的其他人,请注意Client.logout()功能会丢弃您的Cookie。例如:

response = self.client.post(self.url, self.data)
print response.client.cookies.items()  # Displays the cookie you just set

self.client.logout()

response = self.client.post(reverse('loginpage'), {'username': 'username', 'password': 'password'}, follow=True)
print response.client.cookies.items()  # Does not display the cookie you set before since it got destroyed by logout()

为确保您的Cookie在测试期间保持活跃,请拨打您的退出页面,而不是使用Client.logout()功能,如下所示:

response = self.client.post(self.url, self.data)
print response.client.cookies.items()  # Displays the cookie you just set

self.client.get(reverse('logoutpage'))

response = self.client.post(reverse('loginpage'), {'username': 'username', 'password': 'password'}, follow=True)
print response.client.cookies.items()  # Does display the cookie you set before since it did not get destroyed by client.logout()

答案 3 :(得分:0)

与接受的答案相反,您可以直接在测试客户端上设置Cookie。

记住一切都是对象,您只需要知道在哪里/要修补什么

所以它是这样的:

client.cookies[key] = data

client.cookies是标准库中http.cookies.SimpleCookie的实例,其行为类似于dict。因此您可以使用.update来批量更新Cookie值。如果您想更改其他Cookie值,例如max-agepath domain等,则这很有用。

最后,如果您想设置signed_cookie,则可以像这样重用django的帮助程序:

from django.core.signing import get_cookie_signer

signed_cookie_value = get_cookie_signer(salt=key).sign(data)
client.cookies[key] = signed_cookie_value

注意盐。它的两端必须匹配(签名和检索)。用于签名的不同盐值会生成一个不同的cookie,当您调用response.get_signed_cookie(key)

时,该cookie无法检索。