25


7

django tests.pyで管理者ユーザーを作成する方法

tests.pyの一部として管理者ユーザーを作成して、権限を確認しようとしています。

更新:tests.pyはTestCaseをサブクラス化する標準形式であり、以下のコードはsetUp()関数で呼び出されます。

通常のユーザーを作成できますが、管理ユーザーは作成できません。 私がこれを試した場合:

    self.adminuser = User.objects.create_user('admin', '[email protected]', 'pass')
    self.adminuser.save()
    self.adminuser.is_staff = True
    self.adminuser.save()

またはself.adminuser = User.objects.create_superuser( 'admin'、 '[email protected]'、 'pass')self.adminuser.save()

私は得ます:

Warning: Data truncated for column 'name' at row 1

is_staff行を削除すると、すべてうまくいきます(テストを行えないことを除いて!)

管理者ユーザーをフィクスチャとしてロードする必要がありますか?

UserProfileは次のように定義されます。

class UserProfile(models.Model):

    user = models.ForeignKey(User, unique=True)
    organisation = models.ForeignKey(Organisation, null=True, blank=True)
    telephone = models.CharField(max_length=20, null=True, blank=True)

完全なエラートレースバックは次のとおりです。

    Traceback (most recent call last):
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 242, in __call__
        self._pre_setup()
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 217, in _pre_setup
        self._fixture_setup()
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 440, in _fixture_setup
        return super(TestCase, self)._fixture_setup()
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/test/testcases.py", line 222, in _fixture_setup
        call_command('flush', verbosity=0, interactive=False)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/__init__.py", line 166, in call_command
        return klass.execute(*args, **defaults)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/base.py", line 222, in execute
        output = self.handle(*args, **options)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/base.py", line 351, in handle
        return self.handle_noargs(**options)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/commands/flush.py", line 61, in handle_noargs
        emit_post_sync_signal(models.get_models(), verbosity, interactive)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/core/management/sql.py", line 205, in emit_post_sync_signal
        interactive=interactive)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/dispatch/dispatcher.py", line 166, in send
        response = receiver(signal=self, sender=sender, **named)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/contrib/auth/management/__init__.py", line 28, in create_permissions
        defaults={'name': name, 'content_type': ctype})
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/manager.py", line 123, in get_or_create
        return self.get_query_set().get_or_create(**kwargs)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/query.py", line 335, in get_or_create
        obj.save(force_insert=True)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/base.py", line 410, in save
        self.save_base(force_insert=force_insert, force_update=force_update)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/base.py", line 495, in save_base
        result = manager._insert(values, return_id=update_pk)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/manager.py", line 177, in _insert
        return insert_query(self.model, values, **kwargs)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/query.py", line 1087, in insert_query
        return query.execute_sql(return_id)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/sql/subqueries.py", line 320, in execute_sql
        cursor = super(InsertQuery, self).execute_sql(None)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/models/sql/query.py", line 2369, in execute_sql
        cursor.execute(sql, params)
      File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/db/backends/mysql/base.py", line 84, in execute
        return self.cursor.execute(query, args)
      File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py", line 175, in execute
      File "build/bdist.linux-x86_64/egg/MySQLdb/cursors.py", line 89, in _warning_check
      File "/usr/lib64/python2.4/warnings.py", line 61, in warn
        warn_explicit(message, category, filename, lineno, module, registry)
      File "/usr/lib64/python2.4/warnings.py", line 96, in warn_explicit
        raise message
    Warning: Data truncated for column 'name' at row 1

*答え*は、setUpでは管理者ユーザーを作成できないが、他の関数では作成できるので、テストで管理者ユーザーが必要な場合はフィクスチャを使用してください!

2 Answer


50


組み込みのhttp://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py#L132 [create_superuser]を使用し、リクエストを行う前にユーザーをログインします。 以下が動作するはずです。

from django.contrib.auth.models import User
from django.test.client import Client

# store the password to login later
password = 'mypassword'

my_admin = User.objects.create_superuser('myuser', '[email protected]', password)

c = Client()

# You'll need to log him in before you can send requests through the client
c.login(username=my_admin.username, password=password)

# tests go here


4


*アップデート2 *

スニペットを実行して、テストケース( django.test.TestCase`のサブクラス)内からスーパーユーザーを作成しました。 すべてうまくいった。 また、 `user = self.adminuser`で UserProfile`のインスタンスを作成して保存しました。 それもうまくいきました。

更新

この行は興味深いです:

File "/usr/lib/python2.4/site-packages/Django-1.1.1-py2.4.egg/django/contrib/auth/management/__init__.py", line 28, in create_permissions
        defaults={'name': name, 'content_type': ctype})

許可の作成時に実行が失敗したように見えます。

元の答え

_ 警告:行1の列 'name’のデータが切り捨てられました _

おかしな。 これをDjangoシェルから試してみたところ、うまくいきました。 Ubuntu JauntyでPostgresql 8.3とDjango 1.2.1を使用しています。 使用しているDjango /データベースのバージョンに関する詳細を教えてください。

また、 User`には name`属性がありません。 「auth.User」を使用しているかどうかを再確認できますか?

_ 管理者ユーザーをフィクスチャとしてロードする必要がありますか? _

あなたは_持っていない_。 ただし、テスト目的でのみこの管理ユーザーを作成する場合は、フィクスチャを追加することをお勧めします。 それが私のプロジェクトでやっていることです。