关于单元测试:Django Test Client意外重定向

Django Test Client Redirects Unexpectedly

当前,我正在使用TestCase发出HTTP Post请求,该请求正在被重定向并且没有发布数据。 我想发出一个发布请求而无需重定向并保留数据。 我该怎么做?

1)重定向证据:

婴儿/ urls.py
从django.conf.urls导入模式,包括url

1
2
3
4
5
urlpatterns = patterns('babies',
  # Endpoints
  url(r'^create_baby/$', 'views.create_baby'),
  ...
)

婴儿/tests.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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结果:

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

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

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

2)没有职位数据的证据

婴儿/views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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',


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

FWIW,如果您具有用于查看的登录名/认证,请检查您的client_stub登录是否成功。我本来期望来自以下情况的例外:

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

根本没有抱怨,但实际上,我的用户名和密码未设置,并且登录失败。实际测试的URL进一步是由于登录失败导致302进入登录页面。


从您自己的pdb转储中,

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

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

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

如果这实际上是预期的行为,则需要知道POST数据不能在重定向中保留下来。这是浏览器的功能,而不是Django中的错误。