在我自己进行单元测试时,我一直在参考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()之外出了什么问题,因为我没想到,所以提前感谢任何可以提供帮助的人。
答案 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'