在Django上进行测试的错误行为

时间:2016-10-12 16:43:36

标签: python django django-testing

我在Django上测试时遇到问题。我一直在阅读文档of the responses,我不能像他们在文档中解释的那样做。

当我收到回复时,我只能访问response.status_code,并且在撰写context时无法访问redirect_chainresponse.(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?我在成功登录后重定向时出错了,在正常使用时它可以正常使用但在测试中没有?

感谢。

1 个答案:

答案 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)