15

組み込みのログイン機能を使用して、テスト クライアントにログインしようとしています。ビューを単体テストしようとしていますが、それらのいくつかをテストするにはログインする必要があります。私はあまりにも長い間これをやろうとしてきましたが、助けが必要です. いくつかのメモ:

create_user() は有効なユーザーを作成しますが、他の場所で使用されています。

client.login() について見たところ、ブール値が返されます。テストを実行すると、失敗は「False is not True」だったので、これは正しいようです。

私が正常にログインした唯一の方法は、 client.post("/my/login/url", {u​​sername and password in dict.}) を呼び出すことですが、何らかの理由で、すべてのテストケースでログインしたままになるわけではありません私は非常に奇妙だと思います。

def setUp(self):
    """
    Initializes the test client and logs it in.
    """
    self.user = create_user()
    self.logged_in = self.client.login(username=self.user.username, password=self.user.password)

def test_valid(self):
    self.assertTrue(self.logged_in)

私はそれを次のように変更しました:

def setUp(self):
    """
    Initializes the test client and logs it in.
    """
    self.password = "password"
    self.user = create_user(password=self.password)
    self.logged_in = self.client.login(username=self.user.username, password=self.password)

それでもログインに失敗します。

create user はクラス "Static" にあり、user_count が 0 に初期化されている場合、関数は次のようになります。

def create_user(username=None, password=None, email=None, is_superuser=False):
    if username is None:
        username = "user%d" % Static.user_count
        while User.objects.filter(username=username).count() != 0:
            Static.user_count += 1
            username = "user%d" % Static.user_count
    if password is None:
        password = "password"
    if email is None:
        email="user%d@test.com" % Static.user_count

    Static.user_count += 1
    user = User.objects.create(username=username, password=password,   is_superuser=is_superuser)
4

1 に答える 1

21

パスワードに直接アクセスすることはできません。password属性は暗号化されています。( Django でのパスワード管理 を参照してください。)

たとえば、ここではパスワードの出力例を示します。

>>> user = User.objects.create_user(username='asdf', email='asdf@example.com', password='xxxx')
>>> user.password
'sha1$166e7$4028738f0c0df0e7ec3cec06843c35d2b5a1aae8'

ご覧のとおり、与えられたのでuser.passwordはないでしょうかxxxx

create_userオプションのパスワードパラメーターを受け入れるように変更します。create_userと の両方に次のようにパスワードを渡しclient.loginます。

def setUp(self):
    """
    Initializes the test client and logs it in.
    """
    password = 'secret'
    self.user = create_user(password=password)
    self.logged_in = self.client.login(username=self.user.username, password=password)

アップデート

create_userUser.objects.create_userの代わりに使用する必要がありUser.objects.createます。そして、作成されたユーザー オブジェクトが返されます。

def create_user(username=None, password=None, email=None, is_superuser=False):
    if username is None:
        username = "user%d" % Static.user_count
        while User.objects.filter(username=username).count() != 0:
            Static.user_count += 1
            username = "user%d" % Static.user_count
    if password is None:
        password = "password"
    if email is None:
        email="user%d@test.com" % Static.user_count

    Static.user_count += 1
    user = User.objects.create_user(username=username, password=password)
    #                   ^^^^^^^^^^^
    user.is_superuser = is_superuser
    user.save()
    return user # <---
于 2013-11-07T03:21:57.213 に答える