我正在使用django 1.10.5和PermissionRequiredMixin 如果他们没有正确的权限,我想返回403错误,而不是将用户重定向到登录 理论上,如果在任何地方引发PermissionDenied,则响应对象的status_code应为403:
测试客户端看不到的唯一例外是Http404,PermissionDenied,SystemExit和SuspiciousOperation。 Django在内部捕获这些异常并将它们转换为适当的HTTP响应代码。在这些情况下,您可以在测试中检查response.status_code。
来自文档:https://docs.djangoproject.com/en/1.10/topics/testing/tools/#exceptions
但是,我的测试在异常django.core.exceptions.PermissionDenied上停止 这是最简单的test.py:
from django.test import TestCase, RequestFactory
from doingTests.views import ViewWithPermission
from django.contrib.auth.models import User
from django.core.exceptions import PermissionDenied
class TestPermission(TestCase):
def test_permission_view(self):
user = User.objects.create(username="john", password="doh")
permView = ViewWithPermission.as_view()
rf = RequestFactory()
request = rf.get('/test/')
request.user = user
self.assertEqual(permView(request).status_code, 403)
使用此view.py:
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.views.generic.base import TemplateView
class ViewWithPermission(PermissionRequiredMixin, TemplateView):
permission_required="doingTests.add_mock"
raise_exception=True
需要什么权限实际上并不重要,随机字符串,自定义权限和内置权限都会引发PermissionDenied。
由于这里有很多变数,我可能只是遗漏了一些东西,例如: permission_required需要一个权限对象而不是一个字符串(试过)。
我误解了以下内容,修正如下:
但是我开始认为这可能是一个错误,因为对PermissionDenied Exception的测试仍会引发异常而不是通过测试!
将test.py中的最后一行转换为:
self.assertRaises(PermissionDenied, permView(request))
如果处理得当,一切正常,这需要使用with语句:
with self.assertRaises(PermissionDenied):
permView(request)
不引发异常,测试通过。我仍然想测试错误代码。