django中测试权限中的ValueError

时间:2015-02-13 10:05:25

标签: python django unit-testing permissions webtest

我想在我的应用程序中测试权限。我想给我的用户权限,看看他们是否在那里。 我收到这个错误:

ValueError: invalid literal for int() with base 10: 'myapp.can_view'

CODE

class PermissionsTest(WebTest):
    def setUp(self):
        self.user = G(User, username='user', password='pass')

    def test_user_login_permission(self):
        app = self.app.get(reverse('myapp:dashboard'), user=self.user)
        self.assertEqual(app.status_code, 200)

    def test_user_add_permissions(self):
        self.user.user_permissions.add('myapp.can_view')
        self.user.save()
        self.assertTrue(self.user.has_perm('myapp.can_view'))

2 个答案:

答案 0 :(得分:3)

User.user_permissions是一个M2M字段,因此您无法在此字段中添加字符串。改为添加Permission实例:

from django.contrib.auth.models import Permission

permission = Permission.objects.get(codename='can_view')
self.user.user_permissions.add(permission)

另请注意权限are cached,因此您必须在测试中重新加载User个对象。

更新:如果您的权限的代号不是唯一的,那么您必须在@ {selcuk的答案中添加content_typeget()来电。

更新2 :要创建一个延迟,您有两个选择。

自动使用permission属性Model.Meta类:

class MyModel(models.Model):
    class Meta:
        permissions = (('can_view', u'Can view my model'), )

手工:

from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission

ct = ContentType.objects.ContentType.objects.get_for_model(MyModel)
permission = Permission.objects.create(content_type=ct,
                                       codename='can_view',
                                       name='Can view my model')

答案 1 :(得分:1)

您应该将permission对象传递给add方法,而不是字符串。这应该有所帮助:

from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get_for_model(MyModel)
permission = Permission.objects.get(content_type=content_type, codename='can_view')
request.user.user_permissions.add(permission)