Pytest-django:设置用户权限
发布时间:2020-12-20 11:57:53 所属栏目:Python 来源:网络整理
导读:我使用pytest 3.0.6和pytest- django 3.1.2为Django工作.我有这个非常简单的测试失败,我不明白发生了什么: # test_mytest.pyimport pytestfrom django.contrib.auth.models import Permissionfrom django.contrib.contenttypes.models import ContentType@p
我使用pytest 3.0.6和pytest-
django 3.1.2为Django工作.我有这个非常简单的测试失败,我不明白发生了什么:
# test_mytest.py import pytest from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType @pytest.mark.django_db def test_user_has_perm(django_user_model): # Create a new user john_doe = django_user_model.objects.create_user('johndoe',email='jd@example.com',password='123456') # Get or create the permission to set on user user_ct = ContentType.objects.get(app_label='auth',model='user') p,_ = Permission.objects.get_or_create(content_type=user_ct,codename='delete_user',name="Can delete user") # User don't have the permission assert john_doe.has_perm(p) is False # Set permission to user john_doe.user_permissions.add(p) assert john_doe.has_perm(p) is True # ---> FAIL 以防万一,测试结果如下: $pytest ============================= test session starts ============================= platform win32 -- Python 3.5.3,pytest-3.0.6,py-1.4.32,pluggy-0.4.0 Django settings: testsite.settings (from ini file) rootdir: D:Devfossdjango-modern-rpc,inifile: tox.ini plugins: pythonpath-0.7.1,django-3.1.2,cov-2.4.0 collected 1 items modernrpcteststest_test_test.py F ================================== FAILURES =================================== _____________________________ test_user_has_perm ______________________________ django_user_model = <class 'django.contrib.auth.models.User'> @pytest.mark.django_db def test_user_has_perm(django_user_model): # Create a new user john_doe = django_user_model.objects.create_user('johndoe',password='123456') # Get or create the permission to set on user user_ct = ContentType.objects.get(app_label='auth',model='user') p,name="Can delete user") # User don't have the permission assert john_doe.has_perm(p) is False # Set permission to user john_doe.user_permissions.add(p) > assert john_doe.has_perm(p) is True # ---> FAIL E assert False is True E + where False = <bound method PermissionsMixin.has_perm of <User: johndoe>>(<Permission: auth | user | Can delete user>) E + where <bound method PermissionsMixin.has_perm of <User: johndoe>> = <User: johndoe>.has_perm modernrpcteststest_test_test.py:20: AssertionError ========================== 1 failed in 0.32 seconds =========================== 配置块,来自tox.ini: [pytest] DJANGO_SETTINGS_MODULE = testsite.settings norecursedirs = .git __pycache__ build dist venv* .tox .vscode .cache *.egg-info python_paths = modernrpc/tests testpaths = modernrpc/tests python_files = test_*.py dummy_*.py 以及来自测试设置的数据库配置: BASE_DIR = os.path.dirname(os.path.dirname(__file__)) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3','NAME': os.path.join(BASE_DIR,'modern_rpc.sqlite3'),},} 我究竟做错了什么 ? 解决方法
你需要使用字符串’app_label.codename’:
此外,如果自上次调用has_permor以来已更改权限,则必须清除user._perm_cache和user._user_perm_cache,以从db中检索此用户的新实例,以确保没有缓存: del john_doe._perm_cache del john_doe._user_perm_cache # OR john_doe = django_user_model.objects.get(username='johndoe') 这是因为has_perm将调用auth后端,后端将首先查询这些缓存. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |