我正在尝试编写测试,以查看我的登录是否重定向到正确的页面。目前我正在使用此代码,该代码不起作用:
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。
答案 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'),