测试需要使用RequestFactory登录的Django视图

EMP*_*EMP 32 python django unit-testing django-views

我是Django的新手,我想对需要用户登录的视图进行单元测试(@login_requred).Django友好地提供了RequestFactory,我理论上可以使用它来直接调用视图:

factory = RequestFactory()
request = factory.get("/my/home/url")
response = views.home(request)
Run Code Online (Sandbox Code Playgroud)

但是,呼叫失败了

AttributeError: 'WSGIRequest' object has no attribute 'session'
Run Code Online (Sandbox Code Playgroud)

显然,这是有意的,但是这会让我离开?如何测试需要身份验证的视图(在我的情况下是所有视图)?或者我完全采取了错误的做法?

我正在使用Django 1.3和Python 2.7.

bmi*_*lac 49

使用RequestFactory时,您正在使用确切已知的输入测试视图.

这允许将测试与各种已安装的中间件组件执行的附加处理的影响隔离开,从而更精确地进行测试.

您可以使用查看函数所需的任何其他数据来设置请求,即:

    request.user = AnonymousUser()
    request.session = {}
Run Code Online (Sandbox Code Playgroud)

我个人的建议是使用TestClient进行集成测试(即:包含许多步骤的商店中的整个用户结账流程)和RequestFactory来测试独立的视图功能行为及其输出(即将产品添加到购物车).


Wil*_*ill 21

正如@bmihelac所提到的,RequestFactory只测试已知输入(这意味着不包含中间件).有关推理的详细信息,请阅读此处.如果你想要一个空白会话,那么公认的解决方案很棒(我同意@dm03514客户端应该用于集成测试).

但是,如果您仍想使用Django的SessionMiddleware(或任何中间件),您可以在测试中执行类似的操作(以下示例用于测试基于类的视图):

from django.contrib.sessions.middleware import SessionMiddleware
from django.test import TestCase, RequestFactory
from someapp.views import SomeView  # a Class Based View


class SomePageTest(TestCase):

    def setUp(self):
        self.factory = RequestFactory()

    def test_some_page_requires_session_middleware(self):
        # Setup
        request = self.factory.get('somepage.html')
        middleware = SessionMiddleware()
        middleware.process_request(request)
        request.session.save()

        response = SomeView.as_view()(request)

        self.assertEqual(response.status_code, 200)
Run Code Online (Sandbox Code Playgroud)