Django单元测试 - 客户端登录似乎不起作用

时间:2018-05-04 17:18:06

标签: python django unit-testing

在我自己进行单元测试时,我一直在参考https://developer.mozilla.org/en-US/docs/Learn/Server-side/Django/Testing中的教程。我的单位测试代码如下:

from django.core.urlresolvers import reverse
from django.test import Client, TestCase
from django.contrib.auth.models import User

from companies.models import Company

class ContactViewTest(TestCase):

    def setUp(self):
        self.client = Client(HTTP_HOST='localhost:8000')

        company = Company(name='Test')
        company.save()

        user = User.objects.create(username='test_user1', email='test_user1@test.com')
        user.set_password('password')
        user.save()

        self.user = user
        self.company = company

    def test_logged_in_all_contacts_correct_template(self):
        c = self.client
        user_login = c.login(username=self.user.username, password=self.user.password)
        self.assertTrue(user_login)

        resp = c.get(reverse('all-contacts'), follow=True)

        # Check if user is logged in
        self.assertEquals(str(resp.context['user']), 'test_user1')
        # Check if response is "success"
        self.assertEqual(resp.status_code, 200)

        self.assertTemplateUsed(resp, 'all_contacts.html')

运行python manage.py测试contacts.tests时,我遇到了一些错误。

第一个是self.assertTrue(user_login),返回AssertionError: False is not true

当我删除self.assertEquals(str(resp.context['user']), 'test_user1')

时,第二个AssertionError: 'AnonymousUser' != 'test_user1'返回self.assertTrue(user_login)

我不确定除了client.login()之外出了什么问题,因为我没想到,所以提前感谢任何可以提供帮助的人。

2 个答案:

答案 0 :(得分:2)

问题是self.user.password哈希密码。

你可以这样做,

user_login = c.login(username=self.user.username, password='password')

或者您可以使用force_login代替,但不需要密码。

c.force_login(self.user)

答案 1 :(得分:0)

以下任何一种情况都是可能的:

确保您使用的是正确的 DJANGO_SETTINGS_MODULE。

以下应用应列在 INSTALLED_APPS 中:

INSTALLED_APPS = (
    ...,
    'django.contrib.auth',
    'django.contrib.sessions'
    ..,
    )

以下中间件应列在 MIDDLEWARE 中:

MIDDLEWARE = (
    ...,
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    ...,
    )

如果您已将 django.contrib.auth.models.User 与自定义用户 my_app.User 交换,则测试要求您在 my_app 中列出 INSTALLED_APPS 并且还 AUTH_USER_MODEL

INSTALLED_APPS = (
...,
    'my_app',
..,
)
AUTH_USER_MODEL = 'my_app.User'