测试登录重定向

时间:2017-05-30 13:48:30

标签: django redirect django-testing

我正在尝试编写测试,以查看我的登录是否重定向到正确的页面。目前我正在使用此代码,该代码不起作用:

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

    @classmethod
    def setUpTestData(cls):
        user_login = get_user_model().objects.create(username='admin', email='admin@test.co.uk', 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测试时很新,所以它可能只是我缺少的东西,但似乎测试应该传递给我。

非常感谢任何帮助。

更新

登录模板看起来像这样(只需使用标准的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。

1 个答案:

答案 0 :(得分:3)

您正在错误地创建用户。您应该使用create_user而不是create(),以便正确地对密码进行哈希处理。

@classmethod
def setUpTestData(cls):
    user_login = get_user_model().objects.create_user(username='admin', email='admin@test.co.uk', 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'),