测试使用cookie/session的django web应用程序

sta*_*ver 3 testing django cookies session unit-testing

在views.py中:

get_dict = Site.objects.getDictionary(request.COOKIES['siteid'])

{获取一个基于来自cookie的id的站点信息的字典}
在tests.py中:

from django.test import TestCase
class WebAppTest(TestCase):
    def test_status(self):
        response = self.client.get('/main/',{})
        response.status_code # --->passed with code 200
        response = self.client.get('/webpage/',{'blog':1})
        response.status_code # ----> this is failing
Run Code Online (Sandbox Code Playgroud)

为了呈现博客页面,它进入一个视图,它使用现有的cookie获取字典,处理它,渲染模板,在运行应用程序时工作正常.但测试失败了.从未测试过Django webapps我不知道如何正确测试它.这是追溯.
Traceback(最近一次调用最后一次):

File "<console>", line 2, in <module>
  File "/usr/lib/pymodules/python2.6/django/test/client.py", line 313, in post
    response = self.request(**r)
  File "/usr/lib/pymodules/python2.6/django/core/handlers/base.py", line 92, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "/var/lib/django/data/../webpage/views.py", line 237, in getCostInfo
    get_dict = Site.objects.getDictionary(request.COOKIES['siteid'])
KeyError: 'siteid'
Run Code Online (Sandbox Code Playgroud)

浏览了一些在线样本,但找不到与cookies/session深度相关的内容.我们非常感谢您对有用链接的任何想法或指示.

Jac*_* M. 6

看一下Django Testing文档Persistent State部分.

在你的情况下,我希望你的测试更像是:

from django.test import TestCase
from django.test.client import Client
class WebAppTest(TestCase):
    def setUp(self):
        self.client = Client()
        session = self.client.session
        session['siteid'] = 69 ## Or any valid siteid.
        session.save()
    def test_status(self):
        response = self.client.get('/main/',{})
        self.assertEqual(response.status_code, 200)   
        response = self.client.get('/webpage/',{'blog':1})
        self.assertEqual(response.status_code, 200)
Run Code Online (Sandbox Code Playgroud)

  • ah session.save()给出了这个AttributeError:'dict'对象没有属性'save'.评论该部分确实有效.这应该是一个好的开始.请你告诉我为什么当siteid存储在会话中时它确实有效.谢谢杰克. (4认同)
  • 刚发现这可能就是当我试图session.save()时发生的事情http://code.djangoproject.com/ticket/11475 (2认同)