【问题标题】:How to create admin user in django tests.py如何在 django tests.py 中创建管理员用户
【发布时间】:2011-03-30 12:51:29
【问题描述】:

我正在尝试在我的 tests.py 中创建一个管理员用户来检查权限。

更新: tests.py 是 TestCase 子类的标准格式,下面的代码在 setUp() 函数中调用。

我可以创建普通用户,但不能创建管理员用户。如果我试试这个:

    self.adminuser = User.objects.create_user('admin', 'admin@test.com', 'pass')
    self.adminuser.save()
    self.adminuser.is_staff = True
    self.adminuser.save()

或 self.adminuser = User.objects.create_superuser('admin', 'admin@test.com', '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 中创建管理员用户,但您可以在任何其他功能中创建,因此如果您希望管理员用户进行测试,请使用夹具!

【问题讨论】:

  • @phoebebright:你能发布模型代码吗?具体来说,UserProfile 及其与User 的关系。
  • @phoebebright:你有什么固定装置设置吗?
  • @phoebebright:附带说明,您的 UserProfile -> User 参考应该是 OneToOneField。见b-list.org/weblog/2006/jun/06/django-tips-extending-user-model
  • @phoebebright:你是在 test_ 方法中调用这个代码 sn-p 吗?还是setUp?还是别的地方?
  • @phoebebright:我赞同 Manoj 的评论...不如将测试用例类完整地发布出来?

标签: django functional-testing


【解决方案1】:

我会使用内置的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', 'myemail@test.com', 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

【讨论】:

  • 当我将 create_user 更改为 create_superuser 时仍然出现相同的错误,甚至没有尝试做客户端位...
  • 在从TestCase继承的测试中执行时,删除c = Client()并将c.login替换为self.client.login
【解决方案2】:

更新 2

执行 sn-p 从测试用例(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 行的“名称”列的数据被截断

奇怪。我从 Django shell 尝试了这个,它对我有用。我在 Ubuntu Jaunty 上使用 Postgresql 8.3 和 Django 1.2.1。您能否详细说明您使用的是哪个版本的 Django/数据库?

另外User 没有name 属性。你能仔细检查一下你是否使用auth.User吗?

我必须将管理员用户加载为固定装置吗?

您不必必须。但是,如果您只是为了测试目的而创建这个管理员用户,那么添加一个 Fixture 是个好主意。这就是我在项目中所做的。

【讨论】:

  • 在 shell 中试过,效果很好。我附加了用户配置文件(其中没有名称),我可以为其他类型的用户添加用户配置文件,而不是超级用户或员工。莫名其妙!
  • @phoebebright:您的错误是否说明它发生在哪个表中...是 auth_user 表吗?
  • 在上面发布了更多信息。
猜你喜欢
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 2012-04-30
  • 2018-11-26
  • 2013-03-15
  • 2019-05-17
相关资源
最近更新 更多