2013-11-29 4 views
1

Это не проходит тест:Зачем мне использовать вспомогательный метод create_user() внутри TestCase в Django?

class LoginTest(TestCase): 
    def test_login(self): 
     self.user = User(username='test', password='test') 
     self.user.save() 
     login = self.client.login(username='test', password='test') 
     self.assertTrue(login) 

Но это передает:

class LoginTest(TestCase): 
    def test_login(self): 
     self.user = User.objects.create_user(username='test', password='test') 
     login = self.client.login(username='test', password='test') 
     self.assertTrue(login) 

Может кто-нибудь объяснить мне, почему? Вне класса TestCase он работает.

EDIT: Он работал вне TestCase, потому что я пытался с существующим пользователем. См. Ответ falsetru.

ответ

2

Если вы не используете User.objects.create_user, пароль сохраняется как есть (без зашифрования).

check_password (то есть, оно ис пользуется login, authenticate, ...) ожидает, что пароль зашифрован.

И последний код должен выйти из строя без использования User.objects.create_user:

>>> from django.test import Client 
>>> c = Client() 
>>> user = User(username='test', password='test') 
>>> user.save() 
>>> c.login(username='test', password='test') 
False 
>>> from django.contrib.auth import authenticate 
>>> authenticate(username='test', password='test') # => None 
>>> 

User.objects.create_user использования!

>>> user2 = User.objects.create_user(username='test2', password='test') 
>>> c.login(username='test2', password='test') 
True 
>>> authenticate(username='test2', password='test') 
<User: test2> 
>>> user2.check_password('test') 
True 
+0

О, боже, да, я виноват, я написал третий пример кода по памяти, но когда я попробовал, он использовал уже созданное имя пользователя. Теперь все ясно. Я редактирую его, чтобы избежать путаницы. Спасибо! – David

Смежные вопросы