2017-05-30 136 views
1

我想写一个测试,看看我的登录是否重定向到正确的页面。目前我使用这个代码是不工作:测试登录重定向

class TestAuth(TestCase): 
    def setUp(self): 
     self.client = Client() 

    @classmethod 
    def setUpTestData(cls): 
     user_login = get_user_model().objects.create(username='admin', email='[email protected]', password='asdf1234') 

     cls.user_login = user_login 

    def test_login_redirect(self): 
     response = self.client.post(
      reverse('udt:login'), 
      { 
       'username': 'admin', 
       'password': 'asdf1234' 
      } 
     ) 

     self.assertRedirects(response, reverse('udt:table_list')) 

其中udt:login相当于'/udt/accounts/login/'udt:table_list相当于'/udt/table/'

登录功能是Django内置的自定义模板登录功能。当我运行测试,我得到以下错误:

AssertionError: 200 != 302 : Response didn't redirect as expected: Response code was 200 (expected 302) 

然而,当我实际测试中应用的登录功能,我得到这个:

[2017/05/30 14:43:22] HTTP POST /udt/accounts/login/ 302 [0.13, 127.0.0.1:60127] 
[2017/05/30 14:43:22] HTTP GET /udt/table/ 200 [0.15, 127.0.0.1:60127] 

这对我来说好像它实际上是正确重定向。

所以,我的问题是我的测试导致断言错误是什么错误?我在Django测试很新,所以它可能只是我缺少的东西,但它好像测试应该传递给我。

任何帮助,这将不胜感激。

UPDATE

登录模板看起来像这样(只是把标准的Django登录模板,并增加了一些引导类名的话):

{% load bootstrap3 %} 

<form id="login-form" method="post" action="{% url 'udt:login' %}"> 
    {% csrf_token %} 
    <table class="table"> 
     <tr> 
      <td><label for="id_username">Username</label></td> 
      <td><input id="id_username" name="username" type="text" class="form-control"></td> 
     </tr> 
     <tr> 
      <td><label for="id_password">Password</label></td> 
      <td><input id="id_password" name="password" type="password" class="form-control"></td> 
     </tr> 
    </table> 
    {% if form.errors %} 
     <p class=" label label-danger"> 
      Your username and password didn't match. 
      Please try again. 
     </p> 
    {% endif %} 
    <input type="submit" value="Login" class="btn btn-primary pull-right" /> 
    <input type="hidden" name="next" value="{{ next }}" /> 
</form> 

网址进行登录看起来像这样:

url(r'^login/$', auth_views.login, {'template_name': 'auth/login.html'}, name='login') 

我正在使用Django v.1.11.1。

+0

我不能帮你的测试,但我认为完成你正在做的事情的最好方法是简单地把这一行放到你的settings.py 'LOGIN_REDIRECT_URL ='/ YourSite /''这个工作100%。 – hansTheFranz

+0

我已经在我的settings.py中,我仍然得到相同的错误,所以我不知道为什么它发生了! – BeeNag

+0

在这种情况下,我不能告诉你什么是错的对不起。希望一些更有经验的用户会启发我们。 – hansTheFranz

回答

1

您正在创建用户不正确。您应该使用create_user而不是create(),以便密码正确散列。

@classmethod 
def setUpTestData(cls): 
    user_login = get_user_model().objects.create_user(username='admin', email='[email protected]', password='asdf1234') 

顺便说一句,你可以不必删除您setUp方法。 Django的TestCase班负责为您设置self.client

一两件事 - 你的URL模式是好的Django的1.11,但你可以更新它使用LoginView是Django的兼容2.1+:

url(r'^login/$', auth_views.LoginView.as_view(template_name= 'auth/login.html'), name='login'), 
+0

是的,你说的都对!非常感谢! – BeeNag