93

単体テスト用のユーザーを次の 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', 'ho...@simpson.net', 'simpson') 

どちらの場合も、パスワードは 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) 

ありがとう。

4

6 に答える 6

149

動作しないコード:

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')
于 2015-10-23T04:11:45.970 に答える
67

もっと簡単な方法は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])
于 2016-09-28T09:07:12.830 に答える
5

以下のように確認できますか?

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)

このテストケースはうまくいきました。

于 2015-10-12T06:17:40.177 に答える
0
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)
于 2019-08-22T05:57:07.467 に答える
-4

まだこれに従っている人がいる場合、正常にログインするには、属性 'is_staff' と 'is_active' を True にしておく必要があると思います......

self.user = User.objects.create(username='testuser',password='pwd',is_active=1,is_staff=1)

于 2012-11-14T10:38:48.160 に答える