我在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发送了正确的答案,“登录”就成功了:
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
。我不明白为什么会这样,因为运行Web一切正常,所有视图都按预期重定向。
为什么我只能查看status_code
?我在成功登录后重定向时出错了,在正常使用时它可以正常使用但在测试中没有?
感谢。
答案 0 :(得分:1)
远程身份验证URL希望将凭据作为标头,但您的本地登录视图希望它们为POST
数据。您的测试将凭据作为标题传递到本地视图。
结果,表单传递一个空字典(request.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)