두 가지 방법으로 단위 테스트 용 사용자를 만들었습니다.
1) 대략 다음과 같은 “auth.user”에 대한 고정물을 만듭니다.
{
"pk": 1,
"model": "auth.user",
"fields": {
"username": "homer",
"is_active": 1,
"password":
"sha1$72cd3$4935449e2cd7efb8b3723fb9958fe3bb100a30f2",
...
}
}
겉보기에는 중요하지 않은 부분은 생략했습니다.
2) setUp 함수에서 ‘create_user’를 사용합니다 (비록 모든 것을 조명기 클래스에 보관하고 싶지만) :
def setUp(self):
User.objects.create_user('homer', 'ho...@simpson.net', 'simpson')
두 경우 모두 암호는 심슨입니다.
이 정보가 테스트 데이터베이스에 몇 번이고 올바르게로드되고 있는지 확인했습니다. User.objects.get을 사용하여 User 개체를 가져올 수 있습니다. ‘check_password’를 사용하여 비밀번호가 맞는지 확인할 수 있습니다. 사용자가 활성 상태입니다.
그러나 항상 self.client.login (username = ‘homer’, password = ‘simpson’) 실패합니다. 왜 그런지 당황합니다. 나는 이것과 관련된 모든 인터넷 토론을 읽었다 고 생각합니다. 아무도 도울 수 있습니까?
내 단위 테스트의 로그인 코드는 다음과 같습니다.
login = self.client.login(username='homer', password='simpson')
self.assertTrue(login)
감사.
답변
작동하지 않는 코드 :
from django.contrib.auth.models import User
from django.test import Client
user = User.objects.create(username='testuser', password='12345')
c = Client()
logged_in = c.login(username='testuser', password='12345')
왜 작동하지 않습니까?
위의 스 니펫에서 User
를 만들 때 실제 암호 해시는로 설정됩니다 12345
. 클라이언트가 login
메서드를 호출하면 password
인수 값은 12345
해시 함수를 통해 전달되어 다음과 같은 결과가 발생합니다.
hash('12345') = 'adkfh5lkad438....'
그런 다음 데이터베이스에 저장된 해시와 비교되며 클라이언트는 액세스가 거부됩니다. 'adkfh5lkad438....' != '12345'
해결책
해야 할 적절한 일은 set_password
해시 함수를 통해 주어진 문자열을 전달하고 결과를에 저장하는 함수를 호출하는 것입니다 User.password
.
또한 호출 후 set_password
업데이트 된 User
개체를 데이터베이스에 저장해야 합니다.
user = User.objects.create(username='testuser')
user.set_password('12345')
user.save()
c = Client()
logged_in = c.login(username='testuser', password='12345')
답변
더 쉬운 방법은 force_login
Django 1.9의 새로운 기능 을 사용하는 것입니다 .
force_login(user, backend=None)
예를 들면 :
class LoginView(TestCase):
def setUp(self):
self.client.force_login(User.objects.get_or_create(username='testuser')[0])
답변
아래와 같이 확인할 수 있습니까?
from django.test import TransactionTestCase, Client
class UserHistoryTest(TransactionTestCase):
self.user = User.objects.create(username='admin', password='pass@123', email='admin@admin.com')
self.client = Client() # May be you have missed this line
def test_history(self):
self.client.login(username=self.user.username, password='pass@123')
# get_history function having login_required decorator
response = self.client.post(reverse('get_history'), {'user_id': self.user.id})
self.assertEqual(response.status_code, 200)
이 테스트 케이스는 저에게 효과적이었습니다.
답변
확인 django.contrib.sessions
에 추가됩니다 INSTALLED_APPS
때문에 client.login()
이 있고, 그렇지 않은 경우는 항상 false를 돌려 보낼 검사 :
https://docs.djangoproject.com/es/1.9/topics/http/sessions/#enabling-sessions
답변
from django.test import TestCase
from django.contrib.auth.models import User
from django.test import Client
class MyProfile(TestCase):
@classmethod
def setUpClass(self):
self.username = 'dummy' + data + '@gmail.com'
self.password = 'Dummy@123'
user = User.objects.create(username=self.username)
user.set_password(self.password)
user.save()
c = Client()
self.client_object = c.login(username=self.username, password=self.password)
self.content_type = "application/json"
response = self.client_object.post('/api/my-profile/', content_type=self.content_type)
답변
여전히 이것을 팔로우하는 사람이 있다면 성공적으로 로그인하려면 ‘is_staff’및 ‘is_active’속성이 True로 유지되어야한다고 생각합니다.
self.user = User.objects.create(username='testuser',password='pwd',is_active=1,is_staff=1)