我想测试我的视图在进程后返回正确的json。这是我的观点:
@login_required
@require_POST
def xxx_view(request):
if 'post_id' in request.POST:
post_id = request.POST['post_id']
post = Post.objects.get(id=post_id)
post.order = 2
post.save()
json_dump = simplejson.dumps({'new_title': post.order,})
return HttpResponse(json_dump, mimetype='application/json')
else:
return HttpResponse('oups')
这可以正常工作。以下是我试过的测试内容:
from django.test import TestCase
from django.test.client import Client
from django.utils import simplejson
from app.models import *
c = Client()
class CustomTests(TestCase):
def test_xxx(self):
json_data = simplejson.dumps({'post_id': 1,})
response = client.post('/content/vote/', json_data,
content_type='application/json',
HTTP_X_REQUESTED_WITH='XMLHttpRequest')
self.assertEqual(response.status_code, 302) # this is OK.
self.assertEqual(response.content, 2) # but this fails.
response.content返回空字符串。
谢谢。
答案 0 :(得分:3)
看起来您的login_required
装饰器正在重定向未经身份验证的用户。确保创建测试用户并使用测试客户端login
方法
https://docs.djangoproject.com/en/dev/topics/testing/overview/#django.test.client.Client.login
答案 1 :(得分:3)
当响应代码为302时,您正在处理重定向。重定向将自己的对象分配给它们,并且它们的.content属性为空。如果要跟随重定向,可以将follow = True添加到client.post,如果要检查重定向位置,可以检查响应[“位置”]。
答案 2 :(得分:0)
如果要使用django.test模块对其进行测试。
Django在请求对象上有一个非常方便的功能,它将确定请求是否为AJAX请求(XMLHttpRequest)。
request.is_ajax()
它只是检查HTTP_X_REQUESTED_WITH标头是否等于“ XMLHttpRequest”,这是大多数javascript库都支持的标准。
from django.test.client import Client
client = Client()
client.post("http://example.com", {"foo": "bar"}, **{'HTTP_X_REQUESTED_WITH':
'XMLHttpRequest'})
答案 3 :(得分:0)
您现在可以执行以下操作:
client.post("http://example.com", {"foo": "bar"}, xhr=True)