如何测试视图是否用"login_required"(Django)修饰

goa*_*thi 4 python testing django decorator login-required

我正在为一个用"login_required"装饰的视图做一些(隔离的)单元测试.例:

@login_required
def my_view(request):
    return HttpResponse('test')
Run Code Online (Sandbox Code Playgroud)

是否可以测试"my_view"函数是否用"login_required"修饰?

我知道我可以通过集成测试(使用测试客户端)来测试行为(匿名用户被重定向到登录页面),但我想通过隔离测试来完成.

任何的想法?

谢谢!

knb*_*nbk 5

当然,必须有可能以某种方式测试它.不过,这绝对不值得.编写完全隔离的单元测试来检查装饰器是否应用只会导致非常复杂的测试.测试错误的可能性高于测试行为错误的可能性.我强烈反对它.

测试它的最简单方法是使用Django Client伪造对相关URL的请求,并检查重定向.如果您使用任何Django的测试用例作为基类:

class MyTestCase(django.test.TestCase):
    def test_login_required(self):
        response = self.client.get(reverse(my_view))
        self.assertRedirects(response, reverse('login'))
Run Code Online (Sandbox Code Playgroud)

稍微复杂但稍微孤立的测试是使用RequestFactory直接调用视图来创建请求对象.assertRedirects()在这种情况下不起作用,因为它取决于由下式设置的属性Client:

from django.test.client import RequestFactory

class MyTestCase(django.test.TestCase):
    @classmethod
    def setUpClass(cls):
        super(MyTestCase, cls).setUpClass()
        self.rf = RequestFactory()

    def test_login_required(self):
        request = self.rf.get('/path/to/view')
        response = my_view(request, *args, **kwargs)
        self.assertEqual(response.status_code, 302)
        self.assertEqual(response['Location'], login_url)
        ...
Run Code Online (Sandbox Code Playgroud)


Joh*_*ohn -2

使用requests库,如果您不向其传递身份验证 cookie,您可以根据是否返回 401/403/200/其他内容来测试是否需要登录

import requests
req = requests.get("http://yoururl.com")
if req.status_code ==200:
    print "login not needed apparently"
else:
    print "check for other status codes or redirect"
Run Code Online (Sandbox Code Playgroud)