Django测试客户端意外重定向

时间:2013-07-03 04:24:54

标签: django unit-testing testing

目前,我正在使用TestCase发出一个HTTP Post请求,该请求被重定向并且没有post数据。我想在不重定向的情况下发布帖子请求并保留数据。我该怎么办?

1)重定向的证据:

婴儿/ urls.py
    来自django.conf.urls导入模式,include,url

urlpatterns = patterns('babies',
  # Endpoints
  url(r'^create_baby/$', 'views.create_baby'),
  ...
)

婴儿/ tests.py

from django.test import TestCase
from django.test.client import Client
import pdb
class OrderCreationTest(TestCase): 
  def setUp(self):
    self.normal_baby_data = {
      'birth_time': {
        'date' : '04-07-2013'
      }
    } 
  def test_baby_creation(self):
    response = self.client.post('/consumer/create_baby/', 
                            self.normal_baby_data,
                            follow=True
                            )
    pdb.set_trace()

bash结果:

(Pdb) response.redirect_chain
[('https://testserver/consumer/create_baby/', 302)]

如果follow = False,则永远不会创建视图的create_baby方法,也没有重定向链。 bash结果是:

(Pdb) response.redirect_chain
*** AttributeError: 'HttpResponseRedirect' object has no attribute 'redirect_chain'

2)证据表明没有发布数据

婴儿/ views.py

def create_baby(request):
  pdb.set_trace()
  ...

(Pdb) p request
<WSGIRequest
path:/consumer/create_baby/,
GET:<QueryDict: {}>,
POST:<QueryDict: {}>,
COOKIES:{'sessionid': 'f88ffoplh6lyytarn9n85z6bd5lefbzo'},
META:{u'CONTENT_TYPE': 'text/html; charset=utf-8',
 u'CSRF_COOKIE': u'OC5LFOj8HvqTu0cKoAmty7vkYP0jNk3Q',
 u'HTTP_COOKIE': u' sessionid=f88ffoplh6lyytarn9n85z6bd5lefbzo; Domain=None; expires=None; Max-Age=None; Path=/; secure',
 u'PATH_INFO': u'/consumer/create_order/',
 u'QUERY_STRING': '',
 u'REMOTE_ADDR': '127.0.0.1',
 u'REQUEST_METHOD': 'GET',
 u'SCRIPT_NAME': u'',
 u'SERVER_NAME': 'testserver',
 u'SERVER_PORT': '80',
 u'SERVER_PROTOCOL': 'HTTP/1.1',
 u'wsgi.errors': <_io.BytesIO object at 0x10a6fa230>,
 u'wsgi.input': <django.test.client.FakePayload object at 0x10b067b50>,
 u'wsgi.multiprocess': True,
 u'wsgi.multithread': False,
 u'wsgi.run_once': False,
 u'wsgi.url_scheme': 'https',

2 个答案:

答案 0 :(得分:2)

(好的,与OP的问题无关,但与Django测试客户端302相关)

FWIW,如果您已为视图登录/验证,请检查您的client_stub登录是否成功。我本以期待以下例外:

res = cls.client_stub.login(username=cls.username, password=cls.password)

根本没有抱怨,但事实上,我的用户名和密码没有设置,登录失败了。正在进行测试的实际网址是将登录失败的302登录到登录页面。

答案 1 :(得分:0)

来自您自己的pdb转储,

<WSGIRequest path:/consumer/create_order/, ...>

在某处,请求被重新路由以将您推送到/consumer/create_order/

  • 检查您的urls.py以确保所有内容都正确连接
  • 检查您的中间件以确保它不会发送回重定向
  • 检查您的create_baby()视图以确保没有逻辑错误。

如果这实际上是预期的行为,您需要知道POST数据在重定向中存活。这是浏览器的一个功能,而不是Django中的错误。