在 Django 上做测试的错误行为
Wrong Behaviour doing tests on Django
我在 Django 上进行测试时遇到问题。我一直在阅读文档 of the responses,但我无法按照文档中的说明进行操作。
当我得到响应时,我只能访问response.status_code
而无法访问context
或redirect_chain
,当我写response.(and now PyCharm shows all available options)
.
我已经检查了 settings.py
并且我已经 'BACKEND': 'django.template.backends.django.DjangoTemplates'
确定我使用的是 Django 模板,所以我不知道为什么不进行测试。我需要配置什么?
我尝试执行的测试代码是:
from django.test import TestCase
from django.test.client import Client
class Test(TestCase):
def testLogin(self):
client = Client()
headers = {'X-OpenAM-Username': 'user', 'X-OpenAM-Password': 'password', 'Content-Type': 'application/json'}
data = {}
response = self.client.post('/login/', headers=headers, data=data, secure=True, follow=True)
assert (response.status_code == 200)
# self.assertRedirects(response, '/menu/', status_code=301, target_status_code=200)
我没有使用 Django 身份验证,登录表单将数据发送给 IDP,如果 IDP 发送正确答案,"login" 成功:
def login(request):
logout(request)
message = None
if request.method == "POST":
form = LoginForm(request.POST)
if form.is_valid():
username = request.POST['username']
password = request.POST['password']
headers = {'X-OpenAM-Username': username, 'X-OpenAM-Password': password, 'Content-Type': 'application/json'}
data = {}
req = requests.post('http://openam.idp.com:8090/openamIDP/json/authenticate', headers=headers, params=data)
if req.status_code == 200:
respJson = json.loads(req.content)
tokenIdJson = respJson['tokenId']
request.session['tokenId'] = tokenIdJson
return render_to_response('menu/menu.html', request)
elif req.status_code == 401:
message = "Invalid username and/or password. Please, try again"
else:
form = LoginForm()
return render_to_response('registration/login.html', {'message': message, 'form': form},
context_instance=RequestContext(request))
重定向断言它已被注释,因为现在它失败了,当我进行调试时,我看到一个空 redirect_chain
。我不明白为什么会这样,因为 运行 网络一切正常,所有视图都按预期重定向。
为什么我只能查看status_code
?我在成功登录后重定向时做错了什么,在正常使用时可以正常使用,但在测试中却不行?
谢谢。
远程身份验证 url 需要凭据作为 headers,但您的本地登录视图需要它们作为 POST
数据。您的测试将凭据作为 headers 传递给您的本地视图。
因此,向表单传递了一个空字典(request.POST
不包含任何实际数据),表单无效。您得到一个空表单作为响应,没有任何重定向。
您只需将凭据作为 post 数据传递到您的本地视图:
def testLogin(self):
client = Client()
data = {'username': 'user', 'password': 'password'}
response = self.client.post('/login/', data=data, secure=True, follow=True)
assert (response.status_code == 200)
self.assertRedirects(response, '/menu/', status_code=301, target_status_code=200)
我在 Django 上进行测试时遇到问题。我一直在阅读文档 of the responses,但我无法按照文档中的说明进行操作。
当我得到响应时,我只能访问response.status_code
而无法访问context
或redirect_chain
,当我写response.(and now PyCharm shows all available options)
.
我已经检查了 settings.py
并且我已经 'BACKEND': 'django.template.backends.django.DjangoTemplates'
确定我使用的是 Django 模板,所以我不知道为什么不进行测试。我需要配置什么?
我尝试执行的测试代码是:
from django.test import TestCase
from django.test.client import Client
class Test(TestCase):
def testLogin(self):
client = Client()
headers = {'X-OpenAM-Username': 'user', 'X-OpenAM-Password': 'password', 'Content-Type': 'application/json'}
data = {}
response = self.client.post('/login/', headers=headers, data=data, secure=True, follow=True)
assert (response.status_code == 200)
# self.assertRedirects(response, '/menu/', status_code=301, target_status_code=200)
我没有使用 Django 身份验证,登录表单将数据发送给 IDP,如果 IDP 发送正确答案,"login" 成功:
def login(request):
logout(request)
message = None
if request.method == "POST":
form = LoginForm(request.POST)
if form.is_valid():
username = request.POST['username']
password = request.POST['password']
headers = {'X-OpenAM-Username': username, 'X-OpenAM-Password': password, 'Content-Type': 'application/json'}
data = {}
req = requests.post('http://openam.idp.com:8090/openamIDP/json/authenticate', headers=headers, params=data)
if req.status_code == 200:
respJson = json.loads(req.content)
tokenIdJson = respJson['tokenId']
request.session['tokenId'] = tokenIdJson
return render_to_response('menu/menu.html', request)
elif req.status_code == 401:
message = "Invalid username and/or password. Please, try again"
else:
form = LoginForm()
return render_to_response('registration/login.html', {'message': message, 'form': form},
context_instance=RequestContext(request))
重定向断言它已被注释,因为现在它失败了,当我进行调试时,我看到一个空 redirect_chain
。我不明白为什么会这样,因为 运行 网络一切正常,所有视图都按预期重定向。
为什么我只能查看status_code
?我在成功登录后重定向时做错了什么,在正常使用时可以正常使用,但在测试中却不行?
谢谢。
远程身份验证 url 需要凭据作为 headers,但您的本地登录视图需要它们作为 POST
数据。您的测试将凭据作为 headers 传递给您的本地视图。
因此,向表单传递了一个空字典(request.POST
不包含任何实际数据),表单无效。您得到一个空表单作为响应,没有任何重定向。
您只需将凭据作为 post 数据传递到您的本地视图:
def testLogin(self):
client = Client()
data = {'username': 'user', 'password': 'password'}
response = self.client.post('/login/', data=data, secure=True, follow=True)
assert (response.status_code == 200)
self.assertRedirects(response, '/menu/', status_code=301, target_status_code=200)