ユニットテスト用のユーザーを2つの方法で作成しました。
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', '[email protected]', '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])
_Django.contrib.sessions
_が_INSTALLED_APPS
_に追加されていることを確認してください。これは、client.login()
がそれをチェックし、そうでない場合は常にfalseを返すためです。
https://docs.djangoproject.com/es/1.9/topics/http/sessions/#enabling-sessions
以下のように確認できますか、
from Django.test import TransactionTestCase, Client
class UserHistoryTest(TransactionTestCase):
self.user = User.objects.create(username='admin', password='pass@123', email='[email protected]')
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)
このテストケースはうまくいきました。
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)