2016-10-04 89 views
0

我想在Django上做我的第一次测试,我不知道这样做或在阅读文档(它解释了一个非常简单的测试)我仍然不知道它是如何做的。在Django中如何测试

我试图做一个测试,“登录”的网址,并使登录,并在成功登录后重定向到授权页面。

from unittest 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 = client.post('/login/', headers=headers, data=data, secure=False) 
     assert(response.status_code == 200) 

而且试验的成功,但我不知道这是怎么一回事,因为装载200“/登录/”或因为测试做的登录名和重定向后,即可获取200码。

我该如何检查登录后重定向的URL是否正确?有一个插件或者什么可以帮助测试?或者我可以在哪里找到一个很好的教程来测试我的观点和模型?

感谢和问候。

+0

为什么不按照[Django doct on testing](https://docs.djangoproject.com/en/1.10/topics/testing/)? –

+0

我试图按照文档的教程,但我得到的错误。 – Aker666

回答

1

要正确测试重定向,使用follow参数

If you set follow to True the client will follow any redirects and a redirect_chain attribute will be set in the response object containing tuples of the intermediate urls and status codes.

那么你的代码是

从django.test进口测试用例

class Test(TestCase): 
    def test_login(self): 
     client = Client() 
     headers = {'X-OpenAM-Username': 'user', 'X-OpenAM-Password': 'password', 'Content-Type': 'application/json'} 
     data = {} 
     response = client.post('/login/', headers=headers, data=data, secure=False) 
     self.assertRedirects(response,'/destination/',302,200) 

请注意,这是self.assertRedirects而不是简单assertassertRedirects

另请注意,上述测试很可能会失败,因为您发布空字典作为表单数据。 Django表单视图在表单无效时不会重定向,并且空表单在这里可能无效。

+0

啊,好的,谢谢。我现在在工作,我会稍后再试!我发送data = {}因为我没有使用Django登录,所以我将登录委托给IDP(OpenAM),并使用相同格式的代码进行操作,因此在测试中它应该也能工作:/ – Aker666

+0

是的,在这种情况下,它应该工作 – e4c5

+0

工程,只有一个问题。为什么我得到“AssertionError:响应没有按预期重定向:响应代码是200(预期302)”在代码上,我使用“return HttpResponseRedirect('/ loggedin')”。这是正确的? – Aker666

1

Django有很多测试工具。对于这个任务,你应该使用Django的测试用例类,例如django.test.TestCase。 然后你可以使用方法assertRedirects(),它会检查你已经被重定向的地方以及哪个代码。你可以找到你需要的任何信息here。 我试着写代码为任务:

from django.test import TestCase 

class Test(TestCase): 
    def test_login(self): 
     data = {'X-OpenAM-Username': 'user', 'X-OpenAM-Password': 'password'} 
     response = client.post('/login/', data=data, content_type='application/json', secure=false) 
     assertRedirects(response, '/expected_url/', 200) 

然后你可以使用python3 manage.py test运行所有测试。

+0

嗨,我试图这样做之前问这个问题,但我得到“在assertRedirects url = response.url AttributeError:'HttpResponse'对象没有任何属性'网址'”所有的时间。 – Aker666